多对多字段的批量更新

Posted

技术标签:

【中文标题】多对多字段的批量更新【英文标题】:Bulk update for many to many fields 【发布时间】:2013-06-26 05:15:40 【问题描述】:

我有两个模型如下:

class Book(models.Model):
    title = models.CharField(max_length=100)
    year = models.IntegerField(max_lenght=4)
    author = models.ManyToManyField(null=true, blank=true)


class Author(models.CustomUser):
    # some fields

现在,我要做的是将Author 添加到多个Book 对象,而不遍历书籍对象列表。

按照docs,Django 的更新方法不支持ManyToManyField。它说:

您只能使用此方法设置非关系字段和 ForeignKey 字段。要更新非关系字段,请将新值作为常量提供。要更新 ForeignKey 字段,请将新值设置为您要指向的新模型实例。

所以目前我正在执行以下非常低效的操作,因为我将为每个书籍对象访问数据库。

author = Author.objects.get(pk=1)
books = Book.objects.filter(**kwargs) # say this returns 100 objects
# each loop here will hit the database making it really inefficient
# for long lists.
for book in books:
    book.authors.add(author)
    book.save()

我很确定有办法解决这个问题,但我只是无法在文档中找到它。

【问题讨论】:

docs.djangoproject.com/en/dev/topics/db/examples/many_to_many 检查这个.....通过 m2m 部分的“另一端”添加 .... How to create an object for a Django model with a many to many field?的可能重复 【参考方案1】:

想推荐一款名为 Bulk Object Field Creator 的应用。它有助于一键更新多个字段;并且用户可以导出 xls 表。试试看here。

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

姜戈 - 2.27 Python 3.8

让我们过滤掉书集

books = Book.objects.filter(...)

创建作者

author = Author.objects.create(...)

为 Book 模型中的 author 字段添加 related_name 作为 author_book。

...
author = models.ManyToManyField(null=true, blank=true, related_name="author_book")
...

现在使用反向关系技术将作者添加到书集中。

author.author_book.add(*books)

使用 * 解包查询集

注意:我们不需要显式调用 save()

【讨论】:

我认为重要的是要注意运行.add() 实际上也保存了添加,这是 bulk_update() 的整个 ppint。很好的答案,我认为它被忽略了,因为没有多少人意识到它确实可以节省 是的。它也可以节省 它从何而来?文档中有链接吗? 不行:相关名称author_book不是author的属性,而是book的属性。应该是author.book.add(*books)。但它也不能解决bulk_update 的问题。【参考方案3】:

答案在这里:https://***.com/a/10116452/202168

简而言之,(在 Django >= 1.4 中)您可以在直通模型上执行 bulk_create,即使您尚未定义自定义直通模型。

【讨论】:

感谢投反对票的匿名投反对票...更有用的是添加评论,简要说明我的回答有什么问题 我没有投反对票,但你应该提供一个实际的答案,而不仅仅是一个链接。 我确实提供了答案

以上是关于多对多字段的批量更新的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中批量更新关系的最佳实践

EF如何更新多对多连接表

django 1.4 多对多批量添加

关于symfony的多对多关联关系的字段更新

Django Admin批量编辑多对多关系

Django ORM 查询更新反向多对多字段