Django - 使用多个 JOIN 计算平均分数



我正在尝试使用 Django ORM 计算每个学生的平均分数。 这是我的模型:

class Student(models.Model):
name = models.CharField(max_length=2000)
birth_date = models.DateField()

class Course(models.Model):
name = models.CharField(max_length=250)
units = models.IntegerField()

class StudentScore(models.Model):
student = models.ForeignKey(Student)
course = models.ForeignKey(Course)
score = models.FloatField()

对于每个学生,平均分数计算如下: 总和(分数 * course_units(/总和(course_units(

我需要获取学生证与平均分数作为输出。

这是等效的SQL查询(假设Django应用程序名称是"虚拟"(:

select ss.student_id, sum(ss.score * c.units) / sum(c.units) 
from dummy_studentscore ss
join dummy_student s on s.id = ss.student_id
join dummy_course c on c.id = ss.course_id
group by ss.student_id

如何使用 Django ORM API 实现相同的目标?

好的,我想通了:

query = StudentScore.objects.values('student') 
.annotate(result=ExpressionWrapper(Sum(F('score') * F('course__units')) / Sum('course__units'), 
output_field=models.FloatField()))

最新更新