sql - Django ORM - 获取组的最新记录

标签 sql django orm group-by

假设我们有 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之前。

来自aggregation docs :

If the values() clause precedes the annotate(), the annotation will be computed using the grouping described by the values() clause.

However, if the annotate() clause precedes the values() clause, the annotations will be generated over the entire query set. In this case, the values() clause only constrains the fields that are generated on output.

所以这应该可以做到:

Meetup.objects.values('language').annotate(latest_date=Max('date'))

关于sql - Django ORM - 获取组的最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17887075/

相关文章:

sql - 更新 SQL 值

javascript - Django 在文本编辑器中插入 utf 8 文本

java - 桌面应用程序中的数据一致

node.js - sequelize [erro]{ this.name}.hasMany 中的模型关联调用不是 Sequelize.Model 的子类

sql - 当列中的所有值并非都相等时返回数据

php - 将两个 SQL 查询合并在一起(语法问题)

mysql - 更新两个不同表中字段的最有效方法?

django - Nginx 不支持 Django 管理静态文件

django get_or_create返回错误: 'tuple' object has no attribute

java - 在 Hibernate 中使用接口(interface)而不是具体类映射 HashMap