在以下设置中,我想要一个带有项目列表的 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()中解释的行为相关,多次导致错误答案我得到的 tasks_duration 远高于应有的值。多个 annotate(Sum()) 子句在结果 SQL 中产生多个左内连接。tasks_duration 只有一个 annotate(Sum()) 项,结果是正确的。但是,我想同时拥有 tasks_duration 和 subtasks_duration。
进行此查询的合适方法是什么?我有一个可行的解决方案,可以按项目执行,但预计速度会慢得无法使用。我也有类似的工作与 extra() 调用,但我真的很想知道我想要的是否可以使用纯 Django。