【问题标题】:How to compute average of an aggregate in django如何在 django 中计算聚合的平均值
【发布时间】:2016-06-24 20:29:12
【问题描述】:

如果我有一个聚合,我可以得到查询中值的平均值,而不用在 python 内存中计算它吗?

from django.db.models import F, Sum, FloatField, Avg
Model.objects.filter(...)\
    .values('id')\
    .annotate(subtotal=Sum(...math here...), output_field=FloatField())\
    .annotate(total=Avg(F('subtotal'))) #this line throws a FieldError

有没有办法在查询中获取subtotal 值中的Avg?它给了我一个错误,我不允许在聚合(“subtotal”)上计算 Avg,但我无法替换 .values('id') 分组,因为里面的 .annotate(...math here...) 操作不是 @987654321 @跨越Model对象。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:
    from django.db.models import F, Sum, FloatField, Avg
    Model.objects.filter(...)\
        .values('id')\
        .annotate(subtotal=Sum(...math here..., output_field=FloatField()))\
        .aggregate(total=Avg(F('subtotal')))
    

    Aggregating annotations。注意:output_field 是Sum 的参数,而不是annotate()。

    【讨论】:

    • 我遇到了同样的问题,但我需要对多个(已经)聚合字段进行平均。像.aggregate(total=Avg(F('subtotal_1'), F('subtotal_2'), F('subtotal_3'))) 这样的东西,但它抱怨说subtotal_1 是一个聚合......如何解决这个问题? Here's a similar question.
    • 确保注释字段的名称与聚合字段名称不同。否则会出现一个令人困惑的错误,即不容易与字段命名相关联。
    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 2023-04-05
    • 2012-10-11
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多