如何根据两列汇总计算的平均值?

问题描述 投票:1回答:2

我想写一个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

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

python django average django-orm
2个回答
1
投票

你不需要Func用于除法,但你需要调和两种不同的字段类型。在ExpressionWrapper周围使用Avg

from django.db.models import ExpressionWrapper

everything_avg = (StatByDow.objects
    .aggregate(avg=ExpressionWrapper(
        Avg(F('total_score') / F('num_articles')),
        DecimalField()
    ))
)

你也可以使用从整数到十进制的Cast(不是PostgreSQL,它反对Django的语法::numeric(NONE, NONE))或者围绕分区的ExpressionWrapper,但最后只有一个ExpressionWrapper是最快的解决方案,因为它最后会发生一次。


0
投票

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

everything_avg = StatByDow.objects.all().aggregate(avg_f=Avg(Func(F('total_score') / F('num_articles'))))
© www.soinside.com 2019 - 2024. All rights reserved.