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