【发布时间】:2017-06-10 21:44:08
【问题描述】:
将我的问题转换为更简单的领域,假设我继承了一个 django 应用程序,其数据模型将测试成绩表示为字母(“A+”、“A”、“A-”、“B+”等),并且我想要将平均成绩报告为百分比,其中 {"A+": 100, "A": 95, ...}。
玩具模型:
class TestGrade(models.Model):
student = ForeignKey(Student)
letter_grade = CharField()
course = ForeignKey(Course)
(假设更改模型并进行迁移 - 明智的解决方案 - 不可行,可能是因为我们希望灵活地将字母等级的不同映射应用于数字分数)
为了报告这些,我使用明显的查询获得给定课程的成绩,然后根据上面的映射应用案例陈述,类似于
grades.annotate(score=Case(When(letter_grade="A+", then=Value(100)),
When(letter_grade="A", then=Value(95)),
...
default=Value(0),
output_field=IntegerField)))
现在,我想对学生进行 GROUP BY 并报告他们的平均成绩。不幸的是,标准的 djangonic 方式来做 GROUP BY,
grades.values("student_id").annotate(Avg('score'))
死于KeyError: 'score'
grades.values("student_id", "score").annotate(Avg('score'))
不会死得很惨,但它当然是按 id 和 score 的元组分组的,这不是我想要的。
有没有办法按 student_id 分组并用合成值的平均值进行注释?
显然,我可以在 python 中执行此操作,但出于通常的原因,如果可能的话,我想在 ORM 中执行此操作。
【问题讨论】:
标签: django django-orm