Предположим, что у меня есть эта модель:
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()
Теперь, если я хочу эффективно просматривать подмножество фотографий в подмножестве альбомов. Я делаю это примерно так:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.all()
Это делает только два запроса, которые я ожидаю (один для получения альбомов, а затем один из них: SELECT * IN photos WHERE photoalbum_id IN().
Все отлично.
Но если я это сделаю:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.filter(format=1)
Затем он обрабатывает тонну запросов с помощью WHERE format = 1
! Я что-то делаю неправильно или django недостаточно умен, чтобы понять, что он уже набрал все фотографии и может фильтровать их на python? Клянусь, я где-то читал в документации, что он должен это делать...