web-dev-qa-db-ja.com

Django:prefetch_related()は関係の逆引き参照を行いますか?

Django 1.4でトランクからprefetch_related()を試しましたが、逆ルックアップをプリフェッチできません。

私の簡易モデル(各本には多くの価格があります):

class Book(models.Model):
    # some fields

class Price(models.Model):
    book = models.ForeignKey(Book)

私のビューのクエリ:

books = Book.objects.prefetch_related('price')

次に、AttributeErrorメッセージが表示されました。

AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related()

動作させる方法は?ありがとう。

48
Tianissimo

関連する名前を定義します。

class Price(models.Model):
    book = models.ForeignKey(Book, related_name='prices')

そしてそれを使用します:

books = Book.objects.prefetch_related('prices')
81
Jan Pöschko

リレーションに対して_related_name_を定義していない場合、逆リレーションには__set_が追加されます。これは、オブジェクトから逆リレーションにアクセスする場合(例:some_book.price_set.all())ですが、これは_prefetch_related_でも機能します:

_books = Book.objects.prefetch_related('price_set')
_

これはフィルターとは異なるように見えることに注意してくださいdoes __set_なしで他のモデルの名前を受け入れます(例:Books.objects.filter(price__currency='EUR'))。

上記は1.11.8でテストされました(この特定のコードではなく、私自身の同様のコードで)。

または、上記のJanPöschkoが示すように、_related_name_を追加できます。

14