请考虑以下模型:

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)

我们的 idea 是,对一名员工进行审查,我们 for each 问题记录分数.

我可以通过执行以下操作来获得员工判断的总分:

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

这很好,100

我从以下几个方面开始:

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

我假设我已经达到了波斯格雷斯的限制?

我知道我可以通过使用真实的字段来存储分数来解决这个问题,但我只是好奇是否可以严格使用注释来做到这一点?

推荐答案

您可以使用以下选项进行注释:

from django.db.models import Avg, F

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

Django相关问答推荐

Django项目陷入登录页面

DRF中是否有有效的更新有序数据的算法?

我找不到为什么我的DRF登录测试没有按预期工作

Django中的DateTimeField到DateField

UpdateView 不会对 from 属性进行数据绑定

如何在 ModelViewSet 逻辑中读取查询字符串值?

如何让两个模型相互引用 Django

为 Django 模型生成非顺序 ID/PK

如何在 django 中生成 url

在 Django 的 ORM 中访问存储过程的最佳方法是什么

在基于类的通用视图 CreateView 中访问 request.user 以便在 Django 中设置 FK 字段

virtualenv(python3.4), pip install mysqlclient 错误

Django ModelChoiceField optgroup 标签

Django:如何过滤属于特定组的用户

如何在 Django/Python 中减go 两个日期?

Django REST Framework - 序列化可选字段

django.core.servers.basehttp.FileWrapper 在 Django 1.9 中消失

Django 将多个模型传递给一个模板

如何将类、id、占位符属性添加到 django 模型表单中的字段

Django 字符串到日期格式