【发布时间】:2016-05-02 00:21:06
【问题描述】:
我有两个简单的 Django 模型:
class PhotoStream(models.Model):
cover = models.ForeignKey('links.Photo')
creation_time = models.DateTimeField(auto_now_add=True)
class Photo(models.Model):
owner = models.ForeignKey(User)
which_stream = models.ManyToManyField(PhotoStream)
image_file = models.ImageField(upload_to=upload_photo_to_location, storage=OverwriteStorage())
目前我拥有的唯一数据是 6 张照片,它们都属于 1 个照片流。在形成照片流查询集时,我正在尝试以下方法来预取所有相关照片:
queryset = PhotoStream.objects.order_by('-creation_time').prefetch_related('photo_set')
for obj in queryset:
print obj.photo_set.all()
#print connection.queries
通过调试工具栏检查,我发现如果我删除语句的prefetch_related 部分,上面的查询数量完全相同。它显然不起作用。我也试过prefetch_related('cover') - 这也不起作用。
谁能指出我做错了什么,以及如何解决?我的目标是获取查询集中每个照片流的所有相关照片。我怎么可能做到这一点?
在运行 for 循环后打印 connection.queries 包括:
SELECT ("links_photo_which_stream"."photostream_id") AS "_prefetch_related_val", "links_photo"."id", "links_photo"."owner_id", "links_photo"."image_file" FROM "links_photo" INNER JOIN "links_photo_which_stream" ON ("links_photo"."id" = "links_photo_which_stream"."photo_id") WHERE "links_photo_which_stream"."photostream_id" IN (1)
注意:我已经简化了问题中发布的模型,因此上面的查询不包括一些实际出现在输出中但与此问题无关的字段。
【问题讨论】:
-
你能发布正在生成的查询吗?
-
@solarissmoke:添加
-
谢谢。你能看到其他查询中的每张照片是单独获取的吗?
-
你在
which_stream关系中有through表吗? -
@GwynBleidD:是的,我愿意,因为这是一个 m-2-m 关系。
标签: django django-models django-views django-queryset