Django ORM:many_to_many.extend(some_queryset)

Posted

技术标签:

【中文标题】Django ORM:many_to_many.extend(some_queryset)【英文标题】:Django ORM: many_to_many.extend(some_queryset) 【发布时间】:2020-01-27 16:36:08 【问题描述】:

我阅读了RelatedManager 的文档。

我找不到扩展多对多关系的方法。

示例(这就是我的“梦想”的样子):

my_user.groups.extend(my_group_queryset)

我知道我可以用这个:

for group in my_group_queryset:
    my_user.groups.add(group)

但我更喜欢在 DB 中循环而不是在我的代码中循环 (guidelines)。

有没有办法在一个方法调用中将多个对象添加到多对多关系中?

【问题讨论】:

【参考方案1】:

您可以通过解包查询集来批量添加项目,然后在单个.add(…) [Django-doc] 调用中添加所有这些元素:

my_user.groups.add(<b>*</b>my_group_queryset)

注意前面的星号 (*)。因此,这将解压缩查询集,并将每个项目作为单独的参数传递给 .add(…) 函数。

【讨论】:

我很好奇:这是执行一个还是 N 个 sql 语句?换句话说:循环是在 django-orm 中还是在 DB 中? @guettli:它将以 bulk 的形式添加项目。这意味着通常它会导致两个查询:一个是检索项目,另一个是添加所有项目。如果项目的数量巨大,可能需要几个添加查询(每个添加大量关系)。

以上是关于Django ORM:many_to_many.extend(some_queryset)的主要内容,如果未能解决你的问题,请参考以下文章

Django - ORM操作

Django models ORM基础操作--白话聊Django系列

python 之 Django框架(orm单表查询orm多表查询聚合查询分组查询F查询 Q查询事务Django ORM执行原生SQL)

Django学习第5篇:Django之ORM数据库操作

Django学习第5篇:Django之ORM数据库操作

Django基础之django ORM单表操作