次のセットアップでは、プロジェクトのリストを含む QuerySet が必要です。各プロジェクトには、すべてのタスク期間の合計 (tasks_duration として) とそのタスクのすべてのサブタスク期間の合計 (subtasks_duration として) が注釈として付けられます。私のモデル(簡略化)は次のようになります。
class Project(models.Model):
pass
class Task(models.Model):
project = models.ForeignKey(Project)
duration = models.IntegerField(blank=True, null=True)
class SubTask(models.Model):
task = models.ForeignKey(Task)
duration = models.IntegerField(blank=True, null=True)
QuerySet を次のように作成します。
Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration'))
Django annotate()で説明されている動作に関連して、何度も間違った答えが発生します。複数の annotate(Sum()) 句により、結果の SQL に複数の左内部結合が生成されます。tasks_duration の annotate(Sum()) 用語が 1 つだけの場合、結果は正しいです。ただし、tasks_duration と subtasks_duration の両方が必要です。
このクエリを実行する適切な方法は何ですか? 私はプロジェクトごとにそれを行う実用的なソリューションを持っていますが、それは予想外に遅いです。また、extra() 呼び出しで同様の作業を行っていますが、純粋な Django で必要なことが可能かどうかを知りたいです。