假設我們有如下定義Django的ORM模型Meetup
:Django的ORM - 用不同的選擇條款分組聚集
class Meetup(models.Model):
language = models.CharField()
speaker = models.CharField()
date = models.DateField(auto_now=True)
我想使用一個單一查詢獲取的語言,揚聲器和日期爲每個語言的最新事件 。
>>> 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': ...},
]
D'oh!我們正在收到最新的活動,但對於錯誤的分組!
看來我需要一種方式來GROUP BY
language
但SELECT
在不同的 集字段?
更新 - 這種查詢似乎很容易在SQL來表達:
SELECT language, speaker, MAX(date)
FROM app_meetup
GROUP BY language;
我喜歡的方式來做到這一點,而不使用Django的raw()
- 這可能嗎?
更新2 - 經過多番搜索,似乎有在如此相似的問題:
- Django Query that gets the most recent objects
- How can I do a greatest n per group query in Django
- MySQL calls this sort of query a group-wise maximum of a certain column。
更新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 - Get latest record for group
無賴,這是MySQL的。在postgres中,你可以直接使用DISTINCT ON來獲取組的最新版本[無恥的插件來解決我在另一個問題上的答案](http://stackoverflow.com/a/20129229/1309332)。 – dbn