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")和他们需要教学的小时数(所有老师的"requirements .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')

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

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

假设你引用的所有模型都在一个名为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")

相关内容

  • 没有找到相关文章

最新更新