6

そこで、学校のスケジュールを整理するものを作っています。問題の学校は、クラスが同じ部屋にまとめられ、教師が移動するように編成されており、スケジュールは毎日異なり、すべての教師またはクラスが同じ時間に建物内にいるわけではありません。の教師は、いつ教えるかについて非常にうるさいです。

私はこれらのモデルを持っています:

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')

これを行う最善の方法は何ですか?これは可能ですか?

4

1 に答える 1

1

注釈法を使用してそのような比率を計算することはできません。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")
于 2011-12-11T13:21:00.997 に答える