19

次のセットアップでは、プロジェクトのリストを含む 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 で必要なことが可能かどうかを知りたいです。

4

2 に答える 2

1

このエラーも発生します。まったく同じコード。集計を個別に行うと機能しますが、両方の合計を同時に取得しようとすると、一方が 2 倍高くなり、もう一方が 3 倍になります。

Django がこのように動作する理由がわかりません。ここにバグ レポートを提出しました: https://code.djangoproject.com/ticket/19011 フォローすることにも興味があるかもしれません。

于 2012-09-22T10:04:47.890 に答える