Django:如何基于另一个注释进行注释,或者对注释执行操作

时间:2011-11-21 16:27:07

标签: django aggregate annotate

所以我正在制作一些组织学校日程安排的东西。有问题的学校的组织方式是课程在同一个房间里,老师一起移动,时间表每天都不同,并不是所有的老师或班级同时在建筑物内,有些老师们教他们的时候非常挑剔。

我有这些模特:

class Teacher(models.Model):
    christian_name = models.CharField(max_length=200)
    family_name = models.CharField(max_length=200)
    ...

class TeacherAvailableHour(models.Model):
    teacher = models.ForeignKey('Teacher')

class Requirement(models.Model):
    ...
    teacher = models.ForeignKey('Teacher')
    per_week = models.PositiveIntegerField()
    ...

所以我要做的就是先为最挑剔的老师制定一个时间表,即他们可以教授的时间比例最小的教师(总计“教师可用的时间”)以及他们需要教授的小时数(所有老师的“Requirement.per_week”)的总和。

换句话说,我需要“order_by”这个比例。我想不出怎么做。试过这个:

Teachers=Teacher.objects.annotate(availability=(Count('teacheravailablehour') / Sum('requirement__per_week')).order_by('availability')

当然,这会导致错误。我也尝试了类似双重注释的东西:

Teachers=Teacher.objects.annotate(availability=Count('teacheravailablehour')).annotate(required=Sum('requirement__per_week')).annotate(availRatio=(('availability') / ('required')).order_by('-availRatio')

最好的方法是什么?这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

您无法使用注释方法计算此类比率。您需要使用QuerySet API提供的extra方法。虽然使用extra进行查找是不可取的,因为它们不能跨数据库引擎移植,但它们有时是执行此类复杂查询的最佳(或唯一)选项。

假设您引用的所有模型都位于名为schedules的应用中,并且您尚未使用模型中的db_table属性修改表名称'元类,查找将是这样的:

availability_sql = "(select count(*) from schedules_teacheravailablehour where schedules_teacheravailablehour.teacher_id=schedules_teacher.id) * 1.0"
required_hrs_sql = "(select sum(per_week) from schedules_requirement where schedules_requirement.teacher_id=schedules_teacher.id)"
Teacher.objects.extra(select={"ratio":"%s/%s" %(availability_sql, required_hrs_sql)}).order_by("-ratio")