【发布时间】:2016-02-22 15:44:13
【问题描述】:
我正在使用django-activity-stream 来显示最近事件的列表。例如,这些可能是评论或编辑文章的人。 IE。 GenericForeignKey action_object 可以引用 Comment 或 Article。我想显示一个指向 action_object 的链接:
<a href="{{ action.action_object.get_absolute_url }}">
{{ action.action_object }}
</a>
问题是这会导致对每个项目的查询,特别是Comment.get_absolute_url 需要评论的article,它还没有被获取,Article.__unicode__ 需要它的revision.content,它也没有被获取.
django-activity-stream 已经自动调用prefetch_related('action_object') (related discussion)。
尽管the docs 说:
它还支持预取 GenericRelation 和 GenericForeignKey,但是,它必须限制为一组同质的结果。例如,仅当查询仅限于一种 ContentType 时,才支持预取由 GenericForeignKey 引用的对象。
而且内容类型不止一种。但是在我上面的用例中,我需要额外的 prefetch_related 调用,例如:
query = query.prefetch_related('action_object__article`, `action_object__revision`)
但这抱怨是因为Articles 没有__article(如果到了那么远,可能会抱怨Comments 也没有__revision)。我假设这是文档真正指的。所以我想我会试试这个:
comments = query._clone().filter(action_object_content_type=comment_ctype).prefetch_related('action_object__article')
articles = query._clone().filter(action_object_content_type=article_ctype).prefetch_related('action_object__revision')
query = comments | articles
但结果总是空的。我猜查询集只支持单个 prefetch_related 列表,不能像那样加入。
我喜欢返回单个查询集,因为稍后会在这部分不知道的代码中完成进一步的过滤。尽管最终评估查询集后,我希望能够让 django 获取呈现事件所需的所有内容。
还有其他方法吗?
我查看了Prefetch objects,但我认为他们在这种情况下不会提供任何帮助。
【问题讨论】:
标签: python django django-queryset django-orm