web-dev-qa-db-fra.com

Django: prefetch_related () suit-il la recherche de relations inverses?

J'ai essayé prefetch_related () dans Django 1.4 à partir du tronc et je ne peux pas faire de prefetch la recherche inversée.

Mes modèles simplifiés (chaque livre a plusieurs prix):

class Book(models.Model):
    # some fields

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

Requête de ma vue:

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

Ensuite, j'ai reçu le message AttributeError:

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

Comment le faire fonctionner? Merci.

48
Tianissimo

Définissez un nom associé:

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

puis l'utiliser:

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

Lorsque vous n'avez pas défini de related_name Pour la relation, la relation inverse a _set Ajoutée. C'est le cas lors de l'accès à la relation inverse à partir d'un objet (par exemple some_book.price_set.all()), mais cela fonctionne également sur prefetch_related:

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

Notez que cela semble différent du filtre, qui fait accepte le nom de l'autre modèle sans _set (Par exemple Books.objects.filter(price__currency='EUR')).

Ce qui précède a été testé avec 1.11.8 (pas sur ce code spécifique, mais sur mon propre code similaire).

Alternativement, vous pouvez ajouter un related_name, Comme indiqué par Jan Pöschko ci-dessus.

14
Matthijs Kooijman