29

我有两个模型如下:

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

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

您只能使用此方法设置非关系字段和 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()

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

4

3 回答 3

19

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

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

于 2014-03-20T15:20:43.217 回答
10

Django - 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()

于 2020-07-17T11:28:20.870 回答
-1

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

于 2021-10-18T05:41:02.617 回答