这个问题是关于RelatedManager.add(),它用于将模型对象实例添加到多对一或多对多的关系。为了说明我的问题,比方说,我有以下两种模式:现在为什么没有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()
来为这样的关系添加大量对象?非常感谢!
这将帮助:http://stackoverflow.com/questions/6996176/how-to-create-an-object-for-a-django模型与多对多字段 – Thomas
@ init3啊,这很有趣。我并没有意识到你实际上可以将一个主键列表传递给这样的关系:'jk_rowling.books = [1,2,3]'。这在Django的文档中没有说明。太好了,这应该为我节省一些数据库查询。谢谢! – pemistahl