Django ORM 查询 GROUP BY 由 MAX 组合的多个列

Posted

技术标签:

【中文标题】Django ORM 查询 GROUP BY 由 MAX 组合的多个列【英文标题】:Django ORM query GROUP BY multiple columns combined by MAX 【发布时间】:2013-03-23 18:07:37 【问题描述】:

我正在将 Django 与 mysql 一起使用。我有一个类似于以下的模型:

class MM(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()
    c = models.DateTimeField(auto_now_add=True)

我有多个行,a 等于 b,我想执行以下 SQL 查询:

SELECT a, b, MAX(c) AS max FROM MM GROUP BY b, a;

如何使用 Django ORM 完成此操作?我已经尝试过使用注释的不同方法,但现在运气不错。

非常感谢!

【问题讨论】:

【参考方案1】:

我认为你可以这样做:

MM.objects.all().values('b', 'a').annotate(max=Max('c'))

注意,你需要导入一些东西才能使用 Max:from django.db.models import Max

values('b', 'a') 将给出 GROUP BY b, aannotate(...) 将计算查询中的 MAX。

【讨论】:

仅供参考,all() 是多余的,不是必需的。 只是为了形式化,这里是documentation link“...原始结果根据 values() 子句中指定的字段的唯一组合进行分组。”【参考方案2】:

你也可以试试这个

from django.db.models import Max

mm_list=MM.objects.all().values('b','a').annotate(max=Max('c'))
for mm in mm_list:
    a=mm['a']
    b=mm['b']
    max=mm['max']

【讨论】:

【参考方案3】:

用两个字段对字段组求和。

from django.db.models import Sum

SQL

select caja_tipo_id, tipo_movimiento, sum(monto) from config_caja group by caja_tipo_id, tipo_movimiento

姜戈

objs = Caja.objects.values('caja_tipo__nombre','tipo_movimiento').order_by().annotate(total=Sum('monto'))

【讨论】:

以上是关于Django ORM 查询 GROUP BY 由 MAX 组合的多个列的主要内容,如果未能解决你的问题,请参考以下文章

django模型orm进行group by

Django ORM在注释多个聚合列时删除不需要的Group by

Django Average 和 Group By 中的 MYSQL 等效查询

如何使用 django orm 进行嵌套 Group By?

Django ORM,group_by 按所有值分组

如何在 django orm 中使用 Annotation 进行嵌套 Group By?