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

Posted

技术标签:

【中文标题】添加多对多关系时检测重复插入【英文标题】:Detect duplicate inserts when adding many-to-many relation 【发布时间】:2017-08-27 11:19:09 【问题描述】:

假设有两个模型,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() 方法是否返回有用的东西?

【问题讨论】:

在调用add方法之前决定使用一个变量来保持b.children.count(),在添加一个项目后与新值比较之后。但这是一个临时解决方案,性能很差(因为每次我在查询集上调用count(),它都会命中数据库) 【参考方案1】:

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

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

【讨论】:

以上是关于添加多对多关系时检测重复插入的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Core-Data:添加多对多关系

如何首先使用代码向 Identity 默认表 AspNetUsers 添加多对多关系?

在放大graphql中添加多对多连接

Hibernate学习笔记 — 多对多关系映射

实体框架:多对多插入重复

EF Core 5.0 添加多对多使得一对多无法确定