supposons que j'ai ce modèle:
class PhotoAlbum(models.Model):
title = models.CharField(max_length=128)
author = models.CharField(max_length=128)
class Photo(models.Model):
album = models.ForeignKey('PhotoAlbum')
format = models.IntegerField()
Maintenant, si je veux regarder efficacement un sous-ensemble de photos dans un sous-ensemble d'albums. Je fais quelque chose comme ça:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.all()
Cela ne fait que deux requêtes, ce que j'attends (une pour obtenir les albums, puis une comme `SELECT * IN photos WHERE photoalbum_id IN ().
Tout est bon.
Mais si je fais ça:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.filter(format=1)
Ensuite, il fait une tonne de requêtes avec WHERE format = 1
! Est-ce que je fais quelque chose de mal ou est-ce que Django n'est pas assez intelligent pour se rendre compte qu'il a déjà récupéré toutes les photos et peut les filtrer en python? Je jure que j'ai lu quelque part dans la documentation qu'il est censé le faire ...