[Django]-Django: Does prefetch_related() follow reverse relationship lookup?

109👍

✅

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

32👍

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.

Leave a comment