10

想象一下,我们有一个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 作为我的后端。

4

1 回答 1

15

将您的values子句放在annotate.

聚合文档

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

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

所以应该这样做:

Meetup.objects.values('language').annotate(latest_date=Max('date'))
于 2013-07-26T17:17:39.000 回答