我想编写一个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
计算平均值的正确方法是什么?
答案 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'))))