2017-08-07 23 views
0

我想要計算每個使用Django ORM的學生的平均分數。 這裏是我的模型:Django - 使用多個JOIN計算平均分數

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?

回答

0

好了,所以我想通了:

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