1

这个问题是关于RelatedManager.add()的,它用于将模型对象实例添加到多对一或多对多关系。为了说明我的问题,假设我有以下两个模型:

class Book(models.Model):
    title = models.CharField()

class Author(models.Model):
    name = models.CharField()
    books = models.ManyToManyField(Book)

现在,对于每个对象,Author我都有一个Book要添加到关系中的对象列表。目前,我正在这样做:

book_objects = [
    <Book: Harry Potter and the Philosopher's Stone>, 
    <Book: Harry Potter and the Chamber of Secrets>,
    <Book: Harry Potter and the Prisoner of Azkaban>
]

jk_rowling = Author.objects.get(name='J. K. Rowling')

for book in book_objects:
    jk_rowling.books.add(book)
jk_rowling.save()

但是,这不是很有效,因为我必须处理要添加到此类关系中的数千个对象,并且需要很长时间。相反,Django 文档建议add()使用多个模型对象作为参数进行调用。也就是说,我必须这样做:

jk_rowling.books.add(book1, book2, book3)

但我不能这样做,因为我事先不知道添加到关系中的对象数量。我不明白为什么我不能执行以下操作:

jk_rowling.books.add(book_objects)

为什么不add()接受可迭代作为参数?add()以及如何比单独调用每个对象更有效地将大量对象添加到这样的关系中?非常感谢!

4

1 回答 1

4

您可以将数组扩展为可变参数:

book_objects = [
    <Book: Harry Potter and the Philosopher's Stone>, 
    <Book: Harry Potter and the Chamber of Secrets>,
    <Book: Harry Potter and the Prisoner of Azkaban>
]

jk_rowling = Author.objects.get(name='J. K. Rowling')

jk_rowling.books.add(*book_objects)   # <---------------

jk_rowling.save()
于 2012-10-16T21:27:21.920 回答