【问题标题】:annotate group by in django在 django 中注释 group by
【发布时间】:2021-06-05 09:47:20
【问题描述】:

我正在尝试在 django 中执行与此等效的查询:

SELECT SUM(quantity * price) from Sales GROUP BY date.

我的 django 查询如下所示:

Sales.objects.values('date').annotate(total_sum=Sum('price * quantity'))

以上报错:

无法将关键字“价格 * 数量”解析为字段

然后我在检查了这个https://stackoverflow.com/a/18220269/12113049后想出了另一个查询

Sales.objects.values('date').annotate(total_sum=Sum('price', field='price*quantity'))

不幸的是,这对我没有多大帮助。它给了我SUM(price) GROUP BY date 而不是SUM(quantity*price) GROUP BY date

我如何在 django 中查询这个?

【问题讨论】:

    标签: django group-by django-annotate


    【解决方案1】:

    您应该使用F expressions 对字段执行操作:

    from django.db.models import F
    
    Sales.objects.values('date').annotate(total_sum=Sum(F('price') * F('quantity')))
    

    编辑:假设priceDecimalFieldquantityIntegerField(不同类型),您需要在Sum 中指定output_field

    from django.db.models import DecimalField, F
    
    Sales.objects.values('date').annotate(total_sum=Sum(F('price') * F('quantity'), output_field=DecimalField()))
    

    【讨论】:

    • 就我而言,我必须添加 output_field:Sales.objects.values('date').annotate(total_sum=Sum(F('price')*F('quantity'), output_field=浮点字段()))。这将返回空查询集。
    • @MaruthiEranki 不认为您的字段类型是什么,已编辑。
    • 对不起。我将 output_field 设为 FloatField。现在的问题是,django 查询没有返回任何查询集。虽然我有数据。
    • @MaruthiEranki 你确定你使用的是正确的变量等吗?或者使用正确的数据库?尝试直接打印查询集:print(Sales.objects.values('date').annotate(.....))
    • 是的,如果我做 Sum(F('price')),那么它会返回集合。只有当我将 F('price') * F('quantity') 相乘时,它才会返回空集。不知道到底是什么问题。
    猜你喜欢
    • 2021-10-23
    • 2017-08-17
    • 2015-09-12
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2020-12-03
    • 2013-06-19
    • 2021-08-01
    相关资源
    最近更新 更多