2011-11-21 103 views
3

因此,我正在组织一个学校计划。有问题的学校的组织方式是,班级在同一个房间里呆在一起,老师在动,日程安排每天都不一样,并不是所有的老师或班级同时在大楼里,有的的老师在教学时非常挑剔。Django:如何基于另一个注释进行注释,或对注释执行操作

我有这些模型:

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() 
    ... 

所以我试图做的就是做出最挑刺教师的时间表第一,即用时,他们可以教之间的比值最小的那些(总“TeacherAvailableHour “s)和他们需要教的小时数(教师的所有”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') 

这样做的最佳方法是什么?这甚至有可能吗?

回答

0

您无法使用注释方法计算此比例。您需要使用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")