web-dev-qa-db-ja.com

多対多のフィールドの一括更新

私は次のように2つのモデルを持っています:

class Book(models.Model):
    title = models.CharField(max_length=100)
    year = models.IntegerField(max_lenght=4)
    author = models.ManyToManyField(null=true, blank=true)


class Author(models.CustomUser):
    # some fields

今、私が探しているのは、本のオブジェクトのリストを反復処理せずに、複数のAuthorオブジェクトにBookを追加することです。

Djangoのupdateメソッドは、 docs のようにManyToManyFieldをサポートしていません。それは言う

このメソッドを使用して設定できるのは、非関係フィールドと外部キーフィールドのみです。非関係フィールドを更新するには、新しい値を定数として指定します。 ForeignKeyフィールドを更新するには、新しい値を、ポイントする新しいモデルインスタンスに設定します。

そのため、現在、各ブックオブジェクトのデータベースにアクセスするため、非常に非効率的な次のことを行っています。

author = Author.objects.get(pk=1)
books = Book.objects.filter(**kwargs) # say this returns 100 objects
# each loop here will hit the database making it really inefficient
# for long lists.
for book in books:
    book.authors.add(author)
    book.save()

これを回避する方法があると確信していますが、ドキュメントで見つけることができません。どんな助けでもいただければ幸いです。ありがとう

21
Amyth

答えはここにあります:
https://stackoverflow.com/a/10116452/202168

要するに、(Django> = 1.4)ではbulk_createスルーモデルで、カスタムスルーモデルを定義していない場合でも。

17
Anentropic