python - 如何聚合基于两列的计算平均值?
问题描述
我想写一个 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周围Avg
:
from django.db.models import ExpressionWrapper
everything_avg = (StatByDow.objects
.aggregate(avg=ExpressionWrapper(
Avg(F('total_score') / F('num_articles')),
DecimalField()
))
)
您还可以使用Cast
从整数到十进制的 a(不适用于 PostgreSQL,它反对 Django 的语法::numeric(NONE, NONE)
)或ExpressionWrapper
围绕除法,但ExpressionWrapper
最后只有一个是最快的解决方案,因为它在最后发生一次。
推荐阅读
- html - Bootstrap 4垂直对齐对我来说根本不起作用
- python - Selenium 在谷歌日历(Python)中找不到表单元素
- java - jsonrpc4j:java.net.SocketException:来自服务器的文件意外结束
- git - git push --mirror 自动添加不正确工作项的链接
- javascript - 我的 vuejs 动画/过渡滞后于路径更改。
- python - 连接字典列表值,同时在值之间添加“+”号
- java - 错误“包 com_atlassian_clover 不存在”
- visual-studio - Xamarin Forms 应用程序构建问题缺少 DLL
- javascript - MongoDB - Mongoose 查询 findOneAndUpdate() 不更新/复制数据库
- swift - 需要通用 FetchedResultsController 构建器(Swift)