假设我们有 Django ORM 模型Meetup
具有以下定义:
class Meetup(models.Model):
language = models.CharField()
speaker = models.CharField()
date = models.DateField(auto_now=True)
我想用一个single查询以获取语言、说话者和日期
每种语言的最新活动。
>>> Meetup.objects.create(language='python', speaker='mike')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='python', speaker='ryan')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node', speaker='noah')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node', speaker='shawn')
<Meetup: Meetup object>
>>> Meetup.objects.values("language").annotate(latest_date=models.Max("date")).values("language", "speaker", "latest_date")
[
{'speaker': u'mike', 'language': u'python', 'latest_date': ...},
{'speaker': u'ryan', 'language': u'python', 'latest_date': ...},
{'speaker': u'noah', 'language': u'node', 'latest_date': ...},
{'speaker': u'shawn', 'language': u'node', 'latest_date': ...},
]
噢!我们正在获取最新事件,但分组错误!
看来我需要一种方法GROUP BY
the language
but SELECT
在不同的
字段集?
Update- 这种查询似乎很容易用 SQL 表达:
SELECT language, speaker, MAX(date)
FROM app_meetup
GROUP BY language;
我想要一种不使用 Django 的方法来做到这一点raw()
- 是否可以?
Update 2- 经过大量搜索,似乎也有类似的问题:
- 获取最新对象的 Django Query
- 如何在 Django 中进行每组最大 n 查询
-
MySQL 将此类查询称为特定列的分组最大值.
Update 3- 最后,在@danihp的帮助下,这似乎是你能做的最好的事情
是两个查询。我使用了以下方法:
# Abuse the fact that the latest Meetup always has a higher PK to build
# a ValuesList of the latest Meetups grouped by "language".
latest_meetup_pks = (Meetup.objects.values("language")
.annotate(latest_pk=Max("pk"))
.values_list("latest_pk", flat=True))
# Use a second query to grab those latest Meetups!
Meetup.objects.filter(pk__in=latest_meetup_pks)
这个问题是我之前问题的后续:
Django ORM - 获取组的最新记录