Python 在django中获取最新的相关对象

Python 在django中获取最新的相关对象,python,django,orm,Python,Django,Orm,在我的django应用程序中,我有“文档”。每个文档都有一个或多个按创建日期排序的“修订版”。我想要一种方法来获取每个文档的最新版本。到目前为止,我拥有的最好的代码是下面的代码,但我认为一定有一种方法可以用更少的数据库查询来实现这一点 def get_document_templates(): result = [] for d in Document.objects.filter(is_template=True).all(): result.append(d.

在我的django应用程序中,我有“文档”。每个文档都有一个或多个按创建日期排序的“修订版”。我想要一种方法来获取每个文档的最新版本。到目前为止,我拥有的最好的代码是下面的代码,但我认为一定有一种方法可以用更少的数据库查询来实现这一点

def get_document_templates():
    result = []
    for d in Document.objects.filter(is_template=True).all():
        result.append(d.documentrevision_set.latest())
    return result
我一直在研究“注释”和“聚合”过滤器,但不知道如何更有效地实现这一点。我不想在原始SQL中弄脏我的手,因为数据库后端在不久的将来可能会发生变化。有人有什么想法吗


谢谢

您可以从如下模型中获取最新的9个数据:

Model.objects.all().order_by('-date')[0:9]

我认为有两种方法。有人解释了这篇博文。这将为您获取每个
文档
,并附带一个“修订版”(如果您需要访问这两个版本)

如果您只需要
修订版
,可以尝试使用
values()
方法。当与聚合一起使用时,它的功能会发生微妙的变化:

与filter()子句一样,annotate()和values()子句应用于查询的顺序非常重要。如果values()子句位于annotate()之前,则将使用values()子句描述的分组来计算注释

但是,如果annotate()子句位于values()子句之前,则将在整个查询集上生成注释。在本例中,values()子句仅约束在输出时生成的字段

所以您可以按
文档
修订版
进行分组,并在
日期

Revision.objects.all().values('document').aggregate(Max('date'))

啊,谢谢蒂姆,这确实帮了一些忙。Tim,如果你想回答上面的问题,我很乐意接受。这不是他要问的。我已经在元类中有一个“get_latest_by”子句用于文档修订,所以找到最新的没有问题。但是,我需要将其与“父”文档模型相结合,并获取每个文档的最新版本。不幸的是,该代码为我的模型返回一个空查询集,但我根据提供的链接接受,谢谢!