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

时间:2013-08-15 09:26:30

标签: python django orm

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

如果您只想要Revision,则可以尝试使用values()方法。当与聚合一起使用时,它的功能会略有变化:

  

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

     

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

因此,您可以按RevisionDocument进行分组,并在date上汇总

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

答案 1 :(得分:-1)

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

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