我有两个模型如下:
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()
我很确定有一种解决方法,但我无法在文档中找到它。任何帮助,将不胜感激。感谢
答案 0 :(得分:12)
答案在这里:
https://stackoverflow.com/a/10116452/202168
简而言之,(在Django> = 1.4中)您可以在直通模型上执行bulk_create
,即使您还没有通过模型定义自定义。
答案 1 :(得分:4)
Django-2.27 Python 3.8
让我们过滤掉这套书
books = Book.objects.filter(...)
创建作者
author = Author.objects.create(...)
在“图书”模型中为“作者”字段添加related_name作为author_book。
...
author = models.ManyToManyField(null=true, blank=true, related_name="author_book")
...
现在使用反向关联技术将作者添加到书集中。
author.author_book.add(*books)
使用*解压缩查询集