2012-10-16 97 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

相關問題