【问题标题】:Django ORM query GROUP BY multiple columns combined by MAXDjango ORM 查询 GROUP 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 完成此操作?我已经尝试过使用注释的不同方法,但现在运气不错。

非常感谢!

【问题讨论】:

    标签: python mysql orm django-models


    【解决方案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'))
      

      【讨论】:

        猜你喜欢
        • 2021-08-01
        • 2015-12-10
        • 2011-08-05
        • 2019-03-19
        • 2019-11-15
        • 2019-02-28
        • 1970-01-01
        • 2016-01-19
        • 2020-12-03
        相关资源
        最近更新 更多