Python 在django中,有没有一种方法可以在单个查询中直接用相关对象对查询进行注释?

Python 在django中,有没有一种方法可以在单个查询中直接用相关对象对查询进行注释?,python,django,django-orm,annotate,Python,Django,Django Orm,Annotate,考虑这个查询: query = Novel.objects.< ...some filtering... >.annotate( latest_chapter_id=Max("volume__chapter__id") ) query=Novel.objects.。注释( 最新章节id=最大值(“卷章节id”) ) 实际上,我需要的是用最新的章节对象对每个小说进行注释,因此在这个查询之后,我必须执行另一个查询,通过注释ID选择实际对象。我觉得这很难看。有没有办法将它们组合

考虑这个查询:

query = Novel.objects.< ...some filtering... >.annotate(
    latest_chapter_id=Max("volume__chapter__id")
)
query=Novel.objects.<…一些筛选…>。注释(
最新章节id=最大值(“卷章节id”)
)

实际上,我需要的是用最新的
章节
对象对每个
小说
进行注释,因此在这个查询之后,我必须执行另一个查询,通过注释ID选择实际对象。我觉得这很难看。有没有办法将它们组合成一个查询?

没有,不可能将它们组合成一个查询

您可以阅读以下内容找到两种解决方法。

是的,这是可能的

要获得包含其小说中最后一章的查询集,只需执行以下操作:

from django.db.models.expressions import F
from django.db.models.aggregates import Max

Chapters.objects.annotate(last_chapter_pk=Max('novel__chapter__pk')
    ).filter(pk=F('last_chapter_pk'))

在Django 1.7上测试。

是,使用子查询,文档:

在Django3.0上测试

子查询在小说的select语句中创建select语句,然后将其添加为注释。这意味着您只需点击数据库一次

我也更喜欢这个而不是符文的答案,因为它实际上注释了一个新奇的对象


希望这能帮上忙,像我一样迟来的人。

你能用小说来注释章节吗?对我来说似乎不可能,因为我只需要每部小说最新的章节,但一部小说有很多章节,而且章节在不同的卷中。据我所知,
distinct()
在这种情况下是无用的(如果我错了,请纠正我),除了从小说开始,我不知道还有什么其他方法可以选择一章。有什么想法吗?rune kaagaard的答案现在更好了。链接的帖子建议在查询中使用extra()。从Django 1.8开始,不推荐使用extra(),也不推荐使用extra()。不幸的是,它对我不起作用,因为子查询似乎只能返回一列,而不能返回完整的对象。@Gnietschow,是的,如果您想要不止一列,您可能最好使用prefetch_related之类的东西,不幸的是,这对我不起作用,因为我想对两种模型的字段进行排序和筛选。
latest_chapters = Chapter.objects.filter(novel = OuterRef("pk"))\
    .order_by("chapter_order")

novels_with_chapter = Novel.objects.annotate(
    latest_chapter = Subquery(latest_chapters.values("chapter")[:1]))