如何汇总基于两列的计算平均值?

时间:2019-04-01 15:45:34

标签: python django average django-orm

我想编写一个Django查询来给我表中所有行的平均值。我的模特看起来像

class StatByDow(models.Model):
    total_score = models.DecimalField(default=0, max_digits=12, decimal_places=2)
    num_articles = models.IntegerField(default=0)
    day_of_week = IntegerField(
        null=True,
        validators=[
            MaxValueValidator(6),
            MinValueValidator(0)
        ]
    )

我试图像这样计算平均值

everything_avg = StatByDow.objects.all().aggregate(Avg(Func(F('total_score') / F('num_articles'))))

但这会导致错误

  File "/Users/davea/Documents/workspace/mainsite_project/venv/lib/python3.7/site-packages/django/db/models/query.py", line 362, in aggregate
    raise TypeError("Complex aggregates require an alias")
TypeError: Complex aggregates require an alias

计算平均值的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

您不需要NULL进行划分,但是您需要协调两种不同的字段类型。在Func周围使用ExpressionWrapper

Avg

您还可以使用from django.db.models import ExpressionWrapper everything_avg = (StatByDow.objects .aggregate(avg=ExpressionWrapper( Avg(F('total_score') / F('num_articles')), DecimalField() )) ) ,从整数到十进制(不适用于PostgreSQL,后者是Django语法Cast的对象)或除以::numeric(NONE, NONE),但只能使用{{1 }}最后是最快的解决方案,因为它最后只发生一次。

答案 1 :(得分:0)

您需要为聚合函数传递一个别名(显然是错误文本)。查询应该是这样的:

everything_avg = StatByDow.objects.all().aggregate(avg_f=Avg(Func(F('total_score') / F('num_articles'))))