在 Django 的 ManyToMany 关系中按 id 添加对象

Posted

技术标签:

【中文标题】在 Django 的 ManyToMany 关系中按 id 添加对象【英文标题】:Add an object by id in a ManyToMany relation in Django 【发布时间】:2016-09-27 10:37:35 【问题描述】:

Django's ManyToMany field 可以使用my_field.add(my_instance) 填充,但据我了解,实际上只需要my_instance.id 来执行相应的 SQL 查询。

如果我想通过它的 id 添加一个对象,我可以使用my_field.add(MyModel.objects.get(id=id)),但这会生成两个查询而不是一个。我怎样才能避免这个额外的查询?

【问题讨论】:

【参考方案1】:

虽然the documentation of the add method 没有提及,其实你可以直接给它传一个id,像这样:

my_instance.add(id)

当然,这仅在将主键用作关系的标识符时才有效(默认行为)。

【讨论】:

直接传递 id 会导致我出现 TypeError (Django 1.10.5):“TypeError: 'MyRelatedModel' instance expected, got '5835da11-dcde-47da-9664-e5c13e235ccc'” 在 2.2 文档中现在提到这一点:“add() 也接受关系指向的字段作为参数。上面的示例可以重写为 b.entry_set.add(234)。'跨度> hmm.. 似乎使用 id 的工作方式略有不同。如果关系已经存在,那么它会抛出一个IntegrityError,其中添加对象只是忽略现有关系。 所以,我不太正确......你需要确保 pk 与预期的类型相同,否则你会得到IntegrityError。例如,如果你做.add('3') 并且id 应该是一个整数,如果关系已经存在,你会得到一个错误。如果你这样做 .add(3) 那么它将忽略重复。

以上是关于在 Django 的 ManyToMany 关系中按 id 添加对象的主要内容,如果未能解决你的问题,请参考以下文章

python django的ManyToMany简述

基于ManyToMany关系存在过滤Django QuerySet

Django ManyToMany 关系详情详情

Django笔记七之ManyToMany和OneToOne介绍

如何直接查询Django为ManyToMany关系创建的表?

带有额外字段的 Django ManyToMany 字段不会显示在两个关系上