django - 添加多对多关系时检测重复插入

标签 django orm model

假设有两个模型,A 和 B:

class A(models.Model):
    name = models.CharField(max_length=100)


class B(models.Model):
    children = models.ManyToManyField(A)

我正在使用 b.children.add() 方法将 A 的实例添加到 b:

a = A.objects.get(pk=SOMETHING)
b.children.add(a)

据我所知,默认情况下 Django 不允许重复的多对多关系。所以我不能多次添加 A 的相同实例。

但问题就在这里,我用另一个查询获取 A 的实例,然后循环它们并一个一个地添加它们。如何检测重复关系? add() 方法是否返回有用的东西?

最佳答案

一目了然source code显示 Django 首先检查数据库中是否已经存在任何条目,然后只添加新条目。不过,它不会向调用者返回任何信息。

不清楚您是否真的需要检测重复项,或者您是否只是想确保它们没有被添加到数据库中?如果是后者,那么一切都很好。如果是前者,就没有办法绕过数据库。如果您真的很关心性能,您总是可以自己执行检查并更新直通表(即重新实现 add())。

关于django - 添加多对多关系时检测重复插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43170263/

相关文章:

python - 使用 args 的 get_absolute_url() 的 Django 模板不起作用

python - 用于忽略搜索中的字符的正则表达式

architecture - 如何在 3 层应用程序中构造 PetaPOCO 生成的代码?

javascript - Extjs 有一个协会

ruby-on-rails - 使用 RSpec 和 Rails 在模型中测试验证

python - 在 Django 中使用 clean() 方法

python - Django 唯一约束

java - 如何映射名称为JPA中保留字的实体字段

orm - 如何向 One2many 字段中的 Many2many 字段添加多个值?Odoo 10

ruby-on-rails - 迁移数据库和种子时出现 Ruby 错误