2011-11-21 102 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")