django 1.4 多对多批量添加

Posted

技术标签:

【中文标题】django 1.4 多对多批量添加【英文标题】:django 1.4 Many-to-Many bulk add 【发布时间】:2012-06-06 10:01:01 【问题描述】:

我想知道对于多对多关系是否存在相当于“全部添加”或“批量创建”的方法,从而减少了查询的数量(我将在很长的列表中这样做)?

关于这个主题的文档似乎表明这是不可能的:

https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/

**Associate the Article with a Publication:**
a1.publications.add(p1)

**Create another Article, and set it to appear in both Publications:**
a2 = Article(headline='NASA uses Python')
a2.save()
a2.publications.add(p1, p2)
a2.publications.add(p3)

【问题讨论】:

【参考方案1】:

当然可以!你只需要创建一个明确的intermediate table 和 然后使用这个模型的bulk_create 方法。

【讨论】:

其实不需要显式的中间表,见***.com/a/10116452/5112 @Tim 我已经忘记了。好收获! 如果有人希望使用 Postgresql COPY 命令(如 this app 那样)而不是 django ORM 来获得海量数据的更快结果,这是一个非常好的主意。【参考方案2】:

如果您想将查询集添加到多对多关系模型的批量添加或删除方法:

qs = Article.objects.all()
publications = Publications.objects.get(id=1)

publications.article_set.add(*qs)
publications.save()
publications.article_set.remove(*qs)
publications.save()

【讨论】:

你也可以只使用publications.article_set.set(qs)【参考方案3】:

您可以为此使用RelatedManager.set

a2 = Article(headline='NASA uses Python')
a2.save()
a2.publications.set([p1, p2, p3])

The documentation 还告诉我们,最后不需要调用.save()

【讨论】:

然而,set 和 add 是不一样的。 add-without-set 的等价物是 create()。 @Melvyn,是的,因为set() 替换了所有现有关系。【参考方案4】:

添加组并分配其权限的示例

group = Group.objects.create(name='user_manager')
codenames = ['delete_user', 'add_user', 'view_user', 'change_user']
permissions = Permission.objects.filter(codename__in=codenames)
group.permissions.add(*permissions)

【讨论】:

以上是关于django 1.4 多对多批量添加的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin批量编辑多对多关系

多对多字段的批量更新

如何在 Django 中向多对多关系中添加字段?

Django-CRM项目学习-权限(rbac)

如何在多对多表中添加列(Django)

在 Django admin 中添加内联多对多对象