批量更新多个字段

Amy*_*yth 18 django many-to-many bulk

我有两个型号如下:

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
Run Code Online (Sandbox Code Playgroud)

现在,我要做的是添加一个Author多个Book对象而不迭代书对象列表.

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()
Run Code Online (Sandbox Code Playgroud)

我很确定有一种解决方法,但我无法在文档中找到它.任何帮助,将不胜感激.谢谢

Ane*_*pic 15

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

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

  • 感谢投票不足的匿名下选...更有帮助的是添加一条评论,简要解释我的答案有什么问题 (9认同)

Uza*_*aid 6

Django - 2.27 Python 3.8

让我们过滤掉这套书

books = Book.objects.filter(...)
Run Code Online (Sandbox Code Playgroud)

创建作者

author = Author.objects.create(...)
Run Code Online (Sandbox Code Playgroud)

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

...
author = models.ManyToManyField(null=true, blank=true, related_name="author_book")
...
Run Code Online (Sandbox Code Playgroud)

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

author.author_book.add(*books)
Run Code Online (Sandbox Code Playgroud)

使用 * 解压查询集

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