2012-10-16 69 views
1

这个问题是关于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()来为这样的关系添加大量对象?非常感谢!

+1

这将帮助:http://stackoverflow.com/questions/6996176/how-to-create-an-object-for-a-django模型与多对多字段 – Thomas

+0

@ init3啊,这很有趣。我并没有意识到你实际上可以将一个主键列表传递给这样的关系:'jk_rowling.books = [1,2,3]'。这在Django的文档中没有说明。太好了,这应该为我节省一些数据库查询。谢谢! – pemistahl

回答

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

哦,我的!为什么我没有想过呢?这完全合理。非常感谢你!你救了我很多麻烦。 :) – pemistahl

相关问题