Django: Does prefetch_related() follow reverse relationship lookup?

后端 未结 2 672
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-04 23:07

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):



        
相关标签:
2条回答
  • 2020-12-04 23:57

    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')
    
    0 讨论(0)
  • 2020-12-05 00:07

    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.

    0 讨论(0)
提交回复
热议问题