<p><code>LinkData.objects.all().order_by('-id')[0]</code>不是查询集,它是模型对象,因此出现错误。在</p>
<p>您可以尝试<code>LinkData.objects.all().order_by('-id')[0:1]</code>,这确实是一个查询集,但它行不通。给定<code>prefetch_related</code>的工作方式,queryset参数必须返回一个包含所需的所有<code>LinkData</code>记录的queryset(然后进一步过滤,其中的项与LinkTarget对象连接起来)。这个查询集只包含一个项,所以这是不好的。(Django会抱怨“一旦获取了一个片段就无法过滤查询”,并引发了一个异常,因为它应该这样做)。在</p>
<p>我们退后。实际上,你在问一个聚合/注释问题——对于每个LinkTarget,你想知道最新的LinkData对象,或者“id”列的“max”。最简单的方法是只使用id进行注释,然后进行单独的查询以获取所有对象。在</p>
<p>因此,它应该是这样的(我在我的项目中使用了一个类似的模型,所以它应该可以工作,但是下面的代码可能有一些错误):</p>
<pre><code>linktargets = (LinkTargets.objects
.filter(dashboard=True)
.annotate(most_recent_linkdata_id=Max('linkdata_set__id'))
# Now, if we need them, lets collect and get the actual objects
linkdata_ids = [t.most_recent_linkdata_id for t in linktargets]
linkdata_objects = LinkData.objects.filter(id__in=linkdata_ids)
# And we can decorate the LinkTarget objects as well if we want:
linkdata_d = {l.id: l for l in linkdata_objects}
for t in linktargets:
if t.most_recent_linkdata_id is not None:
t.most_recent_linkdata = linkdata_d[t.most_recent_linkdata_id]
</code></pre>
<p>我故意<strong>不</strong>将其放入一个预取中,屏蔽<code>linkdata_set</code>,因为结果是你有欺骗你的对象,<code>linkdata_set</code>属性现在缺少结果。你真的想被它咬下去吗?最好创建一个新的属性,它正好拥有你想要的东西。在</p>