在我的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中弄脏自己,因为数据库后端可能会在不久的将来发生变化。有人有什么想法吗?
谢谢!
答案 0 :(得分:1)
我认为有两种方法。有人解释了这篇博文"Getting the related item in an aggregate"。这将为每个Document
提供一个附加的'修订版'(如果您需要访问这两个版本)。
如果您只想要Revision
,则可以尝试使用values()
方法。当与聚合一起使用时,它的功能会略有变化:
与filter()子句一样,annotate()和values()子句应用于查询的顺序非常重要。如果values()子句在annotate()之前,则将使用values()子句描述的分组来计算注释。
但是,如果annotate()子句位于values()子句之前,则将在整个查询集上生成注释。在这种情况下,values()子句仅约束输出时生成的字段。
因此,您可以按Revision
对Document
进行分组,并在date
上汇总
Revision.objects.all().values('document').aggregate(Max('date'))
答案 1 :(得分:-1)
你可以从这样的模型中获取最新的9个数据:
Model.objects.all().order_by('-date')[0:9]