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()
動作させる方法は?ありがとう。
関連する名前を定義します。
class Price(models.Model):
book = models.ForeignKey(Book, related_name='prices')
そしてそれを使用します:
books = Book.objects.prefetch_related('prices')
リレーションに対して_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
_を追加できます。