假设我有这个模型:
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中对它们进行过滤?我发誓在文档某处读到过应该这样做......