postgresql 获取Django中注解字段的平均值(postgres)

1l5u6lss  于 2023-08-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(68)

考虑以下模型:

class Employee(models.Model):
    name = models.Charfield(max_length=100)

class Evaluation(models.Model):
    employee = models.ForeignKeyField(Employee, on_delete=models.CASCADE)
    question1 = models.PositiveIntegerField(default=0)
    question2 = models.PositiveIntegerField(default=0)

字符串
我们的想法是对员工进行审查,我们为每个问题记录分数。
我可以通过执行以下操作获得员工评估的总分:

models.Evaluation.objects.annotate(score=F(question1) + F(question2))


这很好,但我真的希望能够直接从员工模型中获得员工在多个评估中的平均得分。
我开始说:

score_subquery = models.Evaluation.objects.annotate(score=F(question1) + F(question2)).filter(employee_id=OuterRef('pk').values('score')  
models.Employee.objects.annotate(avg_score=Avg(Subquery(score_subquery)))


这很好,直到有一个以上的评估员工,在这种情况下,我们得到:

more than one row returned by a subquery used as an expression


所以我做了一些调查,发现了ArraySubquery
然而,不幸的是:

score_subquery = models.Evaluation.objects.annotate(score=F(question1) + F(question2)).filter(employee_id=OuterRef('pk').values('score')  
models.Employee.objects.annotate(avg_score=Avg(ArraySubquery(score_subquery)))


崩溃的原因:

function avg(integer[]) does not exist


我假设我已经达到了postgres的限制?
我知道我可以通过使用一个真实的的字段来存储分数来解决这个问题,但我只是好奇,如果这可以通过使用注解来严格完成?

hfwmuf9z

hfwmuf9z1#

您可以使用以下操作进行注解:

from django.db.models import Avg, F

models.Employee.objects.annotate(
    avg_score=Avg(F('evaluation__question1') + F('evaluation__question1'))
)

字符串

相关问题