python - 如何聚合基于两列的计算平均值?

标签 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

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

最佳答案

您不需要使用 Func 进行除法,但需要协调两种不同的字段类型。使用ExpressionWrapper大约平均:

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 是最快的解决方案,因为它在最后发生一次。

关于python - 如何聚合基于两列的计算平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55458958/

相关文章:

java - 使用数组求偶数和奇数平均值

c - 如何计算衰减平均值?

mysql - mysql中的运行平均值

python - tensorflow 中的优化器如何访问在单独函数中创建的变量

python - str.translate 给出 TypeError - Translate 接受一个参数(给定 2 个),在 Python 2 中工作

python - 我的 "urls.py"文件在我的 Django 项目中放在哪里?

ios - django-allauth 中多个设备的访问 token 授权

Python + OpenCV : Enumerate Matrix

python - 如何通过替换 url 的一部分来解析数据

Django 将 FileField 中的文件保存在 docker 容器中