一尘不染

Django ORM-获取组的最新记录

sql

假设我们有Meetup以下定义的Django ORM模型:

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作为后端。


阅读 174

收藏
2021-05-05

共1个答案

一尘不染

将您的values条款放在之前annotate

聚合文档

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

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

因此,应该这样做:

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