29

私は次のように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 メソッドはdocsManyToManyFieldに従ってサポートしていません。それは言います:

このメソッドを使用して設定できるのは、非リレーション フィールドと ForeignKey フィールドのみです。非関係フィールドを更新するには、新しい値を定数として指定します。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()

これを回避する方法があると確信していますが、ドキュメントで見つけることができません。

4

3 に答える 3

19

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

つまり、(Django >= 1.4 では)bulk_createカスタムのスルー モデルを定義していなくても、スルー モデルを実行できます。

于 2014-03-20T15:20:43.217 に答える