0

在我的 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,因为数据库后端可能会在不久的将来发生变化。有人有想法么 ?

谢谢!!

4

2 回答 2

1

我认为有两种方法。有人解释了这篇博文“Getting the related item in a aggregate”。这将为您每个Document人提供一个附加的“修订”(如果您需要访问两者)。

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

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

但是,如果 annotate() 子句在 values() 子句之前,则将在整个查询集上生成注释。在这种情况下,values() 子句仅限制在输出时生成的字段。

所以你可以对RevisionbyDocument和聚合进行分组date

Revision.objects.all().values('document').aggregate(Max('date'))
于 2013-08-15T09:59:54.507 回答
-1

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

Model.objects.all().order_by('-date')[0:9]
于 2013-08-15T09:36:59.333 回答