有效地检索和添加到ManyToManyField



我有两个模型,比如容器和项目。容器有一个"多对多"字段,用于将容器与项目相关联。我想将项目添加到容器,然后列出此容器中的所有项目。但是,我注意到 Django 在添加每个项目之前都会对其进行查询,因此我最终得到了三个查询,一个用于获取所有项目,一个用于检查我要添加的项目是否存在,另一个用于添加项目。有没有办法消除这种多余的检查?

我尝试使用 set 命令完全替换item_set,但它仍然增加了对重复项的额外检查。

# Select all items in item_set
existing = container.item_set.all()
# Select item in item_set (even though we know) and insert item into set
container.item_set.add(new_item)

简而言之:我想在两个查询中将一个新项目添加到集合中,并从集合中添加所有旧项目。

向多对多关系添加新项之前,无需检查关系是否存在。将项目添加到现有关系不会导致添加新行。您可以参考此答案了解详细信息。

换句话说,您可以安全地添加项目,而无需先检查,然后再执行检索:

container.item_set.add(new_item)
items = container.item_set.all()

最新更新