假设我们有Meetup以下定义的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作为后端。
将您的values条款放在之前annotate。
values
annotate
从聚合文档:
如果values()子句位于annotate()之前,则将使用values()子句描述的分组来计算注释。 但是,如果annotate()子句位于values()子句之前,则将在整个查询集上生成注释。在这种情况下,values()子句仅约束在输出中生成的字段。
如果values()子句位于annotate()之前,则将使用values()子句描述的分组来计算注释。
但是,如果annotate()子句位于values()子句之前,则将在整个查询集上生成注释。在这种情况下,values()子句仅约束在输出中生成的字段。
因此,应该这样做:
Meetup.objects.values('language').annotate(latest_date=Max('date'))