Django ManyToMany 字段的 set() 操作是不是清除现有关系?

Posted

技术标签:

【中文标题】Django ManyToMany 字段的 set() 操作是不是清除现有关系?【英文标题】:Does Django ManyToMany field's set() operation clear existing relations?Django ManyToMany 字段的 set() 操作是否清除现有关系? 【发布时间】:2020-12-04 07:25:40 【问题描述】:

下面2种情况下Django ORM操作有什么区别吗?会有任何性能提升等吗?

obj.manytomanyfield.clear()
obj.manytomanyfield.add(1,2,3,4,5)

obj.manytomanyfield.set([1,2,3,4,5])

【问题讨论】:

【参考方案1】:

来自文档,set()-Django doc

此方法接受clear 参数来控制如何执行 手术。如果False(默认),则新元素中缺少 set 使用remove() 删除,只添加新的。如果 clear=True,改为调用clear() 方法,整个集合为 立即添加。

这意味着,

obj.manytomanyfield.clear()
obj.manytomanyfield.add(1,2,3,4,5)

等于

obj.manytomanyfield.set([1,2,3,4,5], <b>clear=True</b>)

【讨论】:

因此,最终 obj 将只有 (1,2,3,4,5) 关系。对吗? @Jarvis 我很确定:是的。关于性能,我也很感兴趣,因为我不确定 clear 参数的真正目的是什么(可能是竞争条件,因为文档中提到了这一点)。

以上是关于Django ManyToMany 字段的 set() 操作是不是清除现有关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何更新Django 的ManyToMany 字段

Django:模型设计,ManyToMany 属性字段?

Django:快速检索manyToMany字段的ID

Django上ManyToMany字段的唯一值

Django:检查模板中ManyToMany字段中的值

Django 1.4 - ManyToMany 字段看起来像用户身份验证中的用户权限字段