最佳答案
假设我有这样一个模型:
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 photolab _ 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 中过滤它们?我发誓我在文件里看到过它应该这么做。