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

时间:2017-08-07 10:14:25

标签: python django

我正在尝试使用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()

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

我需要将学生ID与平均分数作为输出。

这是等效的SQL查询(假设Django应用程序名称为' dummy'):

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实现相同目的?

1 个答案:

答案 0 :(得分:0)

好的,所以我想出来了:

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