次の設定では、すべてのタスク期間の合計(tasks_duration)とそのすべてのタスクの合計で注釈が付けられたプロジェクトのリストを含むQuerySetが必要ですサブタスク継続時間(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)
私はこのように私のクエリセットを作る:行動に関連する
Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration'))
私はそれがあるべきよりもはるかに高いtasks_durationを得るDjango annotate() multiple times causes wrong answersで説明します。複数の注釈(Sum())節は、結果のSQL内で複数の左内部結合を生成します。 tasks_durationのアノテーション(Sum())という用語が1つしかない場合、結果は正しいです。しかし、私は両方のtask_durationとsubtasks_durationを持っていると思います。
このクエリを実行する適切な方法は何でしょうか?私はそれをプロジェクトごとに行う実用的な解決策を持っていますが、それは予想外に遅いです。私は余分な()呼び出しでも同様のことをしていますが、純粋なDjangoで私が望むものがあれば本当に知りたいです。
:だから、トリックを使用してORM以下のように書くことができますリンク先の他の質問に記載されていますか? – jpic
それは、私が望むものではない異なる持続時間の値を合計するためだけに役立つでしょう。私が試した好奇心から、同じ誤った値が得られます。 (期間は異なります) –
この問題を回避する方法はありますか?私は1つのクエリーセットに合計と数を注釈することを試みており、その合計は増え続けています... – StephenTG