76 votes

Django : La fonction prefetch_related() suit-elle la recherche inverse de relations ?

J'ai essayé prefetch_related() dans django 1.4 à partir de trunk et je n'ai pas réussi à faire en sorte que la recherche inverse soit préfixée.

Mes modèles simplifiés (chaque livre comporte de nombreux prix) :

class Book(models.Model):
    # some fields

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

La requête de mon point de 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.

108voto

Jan Pöschko Points 2492

Définir un nom connexe :

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

et ensuite l'utiliser :

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

32voto

Lorsque vous n'avez pas défini un related_name pour la relation, la relation inverse a _set annexé. C'est le cas lorsque l'on accède à la relation inverse à partir d'un objet (par ex. 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 accepter 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 la version 1.11.8 (pas sur ce code spécifique, mais sur mon propre code similaire).

Vous pouvez également ajouter un related_name comme l'a montré Jan Pöschko ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X