【发布时间】:2012-08-19 23:27:09
【问题描述】:
在以下设置中,我想要一个带有项目列表的 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)
我的查询集是这样的:
Projects.objects.annotate(tasks_duration=Sum('task__duration'), subtasks_duration=Sum('task__subtask__duration'))
与Django annotate() multiple times causes wrong answers 中解释的行为相关,我得到的 tasks_duration 远高于应有的值。多个 annotate(Sum()) 子句在结果 SQL 中产生多个左内连接。 tasks_duration 只有一个 annotate(Sum()) 项,结果是正确的。但是,我想同时拥有 tasks_duration 和 subtasks_duration。
执行此查询的合适方法是什么?我有一个可以按项目执行的有效解决方案,但预计速度会慢得无法使用。我也有类似的使用 extra() 调用,但我真的很想知道纯 Django 是否可以实现我想要的。
【问题讨论】:
-
您是否尝试过
tasks_duration=Sum('task__duration', distinct=True), subtasks_duration=Sum('task__subtask__duration', distinct=True),正如您链接的另一个问题中提到的那样? -
这只会用于汇总不同的持续时间值,这不是我想要的。出于好奇,我确实尝试过,仍然产生相同的错误值。 (持续时间会有所不同)
-
找到解决方法了吗?我正在尝试在一个查询集上注释一个总和和一个计数,并且总和不断增加......
-
恐怕我从来没有让这个特殊的结构工作。我刚刚检查了上面的简单示例的派生代码:我最终在 extra() 子句中进行了计数。
-
在 Django 1.11 中提供的 ORM
Subquery构造。当我在 2012 年发布我的问题时,Django 1.11 还遥遥无期!
标签: django django-queryset annotate