Django: Does prefetch_related() follow reverse relationship lookup?

两盒软妹~` 提交于 2019-12-17 15:36:14

问题


I've tried prefetch_related() in django 1.4 from trunk and can't make it to prefetch reverse lookup.

My simplified models (each book has many prices):

class Book(models.Model):
    # some fields

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

My view's query:

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

Then, I got the AttributeError message:

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

How to make it work? Thanks.


回答1:


Define a related name:

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

and then use it:

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



回答2:


When you do not have defined a related_name for the relation, the reverse relation has _set appended. This is the case when accessing the reverse relation from an object (e.g. some_book.price_set.all()), but this also works on prefetch_related:

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

Note that this seems different from filter, which does accept the name of the other model without _set (e.g. Books.objects.filter(price__currency='EUR')).

The above was tested with 1.11.8 (not on this specific code, but on my own, similar code).

Alternatively, you can add a related_name, as shown by Jan Pöschko above.



来源:https://stackoverflow.com/questions/9176430/django-does-prefetch-related-follow-reverse-relationship-lookup

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!