1

この質問は、モデルオブジェクトインスタンスを多対1または多対多の関係に追加するために使用されるRelatedManager.add()に関するものです。私の質問を説明するために、次の2つのモデルがあるとします。

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 に答える