Django ORM - 获取组的最新记录

时间:2013-07-26 17:03:18

标签: sql django orm group-by

想象一下,我们有Django ORM模型Meetup,其定义如下:

class Meetup(models.Model):
    language = models.CharField()
    date = models.DateField(auto_now=True)

我想为每种语言提取最新的聚会。

看起来您可以使用Django Aggregates来轻松查找此内容:

Meetup.objects.annotate(latest_date=Max("date")).values("language", "latest_date")

在我看来,这应该取得每种语言的“最新”聚会。但事实并非如此:

>>> Meetup.objects.create(language='python')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='python')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node')
<Meetup: Meetup object>
>>> Meetup.objects.annotate(latest_date=Max("date")).values("language", "latest_date").count()
4

我期望得到两个最新的Python和Node聚会!

如何构建一个只能获取每种语言的最新聚会的查询?

PS。我正在使用MySQL作为我的后端。

1 个答案:

答案 0 :(得分:11)

values条款放在annotate之前。

来自aggregation docs

  

如果values()子句在annotate()之前,则将使用values()子句描述的分组计算注释。

     

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

所以这应该这样做:

Meetup.objects.values('language').annotate(latest_date=Max('date'))