为什么RelatedManager.add()不接受iterable作为参数?

时间:2012-10-16 21:03:00

标签: python django django-queryset

此问题与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文档recommends以多个模型对象作为参数调用add()。也就是说,我必须像下面这样做:

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

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

jk_rowling.books.add(book_objects)

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

1 个答案:

答案 0 :(得分:4)

您可以将数组扩展为varargs:

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