Je suppose 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 un sous-ensemble de photos dans un sous-ensemble d'albums efficacement. 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 qui est ce que j'attends (une pour obtenir les albums, et ensuite une comme `SELECT * IN photos WHERE photoalbum_id IN ().
Tout est génial.
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 réaliser qu'il a déjà récupéré toutes les photos et peut les filtrer en python ? Je jure avoir lu quelque part dans la documentation qu'il est censé faire ça...