jb.*_*jb. 8 sql django orm group-by
想象一下,我们有Django ORM模型Meetup,其定义如下:
class Meetup(models.Model):
language = models.CharField()
date = models.DateField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
我想为每种语言取一个最新的聚会.
看起来你可以使用Django Aggregates来简化这个查找:
Meetup.objects.annotate(latest_date=Max("date")).values("language", "latest_date")
Run Code Online (Sandbox Code Playgroud)
在我看来,这应该取得每种语言的"最新"聚会.但事实并非如此:
>>> 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
Run Code Online (Sandbox Code Playgroud)
我期望得到两个最新的Python和Node聚会!
如何构建一个只能获取每种语言的最新聚会的查询?
PS.我使用MySQL作为我的后端.
Pet*_*per 12
把你的values条款放在annotate.
来自聚合文档:
如果values()子句在annotate()之前,则将使用values()子句描述的分组计算注释.
但是,如果annotate()子句位于values()子句之前,则将在整个查询集上生成注释.在这种情况下,values()子句仅约束输出时生成的字段.
所以这应该这样做:
Meetup.objects.values('language').annotate(latest_date=Max('date'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4369 次 |
| 最近记录: |