在 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 添加对象的主要内容,如果未能解决你的问题,请参考以下文章
基于ManyToMany关系存在过滤Django QuerySet
Django笔记七之ManyToMany和OneToOne介绍