【问题标题】:Django ORM - Get latest record for groupDjango ORM - 获取组的最新记录
【发布时间】:2013-07-27 01:28:10
【问题描述】:

假设我们有 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 作为我的后端。

【问题讨论】:

  • Meetup.objects.filter(language="python").order_by('-date')[0]
  • @VictorCastilloTorres 抱歉,不清楚 - 目标是在一个查询中获得所有独特的聚会。

标签: sql django orm group-by


【解决方案1】:

将values 子句放在annotate 之前。

来自aggregation docs:

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

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

所以应该这样做:

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

【讨论】:

  • >>> Meetup.objects.values("language").annotate(latest_date=Max("date")) [{'latest_date': datetime.date(2013, 7, 26), 'language': u'node'}, {'latest_date': datetime.date(2013, 7, 26), 'language': u'python'}]
猜你喜欢
  • 2018-06-14
  • 2022-12-07
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 2012-04-10
  • 2013-11-24
  • 2022-01-01
相关资源
最近更新 更多