【问题标题】:Efficiently retrieve from and add to ManyToManyField有效地从 ManyToManyField 中检索和添加
【发布时间】:2019-06-20 18:05:08
【问题描述】:

我有两个模型,比如说 Container 和 Item。 Container 有一个 ManyToMany 字段来将 Containers 关联到 Items。我想将一个项目添加到一个容器中,然后列出这个容器中的所有项目。但是,我注意到 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)

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

【问题讨论】:

    标签: django


    【解决方案1】:

    在向多对多关系添加新项目之前,无需检查关系是否存在。将项目添加到现有关系不会导致添加新行。详情可以参考this answer

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

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

    【讨论】:

    • 不,我没有手动检查。但是当您执行 item_set.add(new_item) 然后检查 django.db.connection.queries 时,它会进行 SELECT 和 INSERT 查询。
    猜你喜欢
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多