首页 > 解决方案 > 需要帮助形成具有多个聚合的查询集

问题描述

我定义了以下模型:

class TestCaseResult(models.Model):
    run_result = models.ForeignKey(
        RunResult,
        on_delete=models.CASCADE,
    )
    name = models.CharField(max_length=128)
    duration = models.DurationField(default=datetime.timedelta)
    result = models.CharField(
        max_length=1,
        choices=(('f', 'failure'), ('s', 'skipped'), ('p', 'passed'), ('e', 'error')),
    )

我试图在单个查询中获取给定 run_result 的每种结果的计数,以及具有该结果的测试用例的持续时间总和。

这给了我每种结果的计数,但我不知道如何获得包含的持续时间的总和。

qs = TestCaseResult.objects.filter(run_result=run_result).values('result').annotate(result_count=Count('result'))

我基本上希望这是生成的 SQL:

SELECT 
    "api2_testcaseresult"."result",
    SUM("api2_testcaseresult"."duration") AS "duration",
    COUNT("api2_testcaseresult"."result") AS "result_count"
FROM "api2_testcaseresult"
WHERE "api2_testcaseresult"."run_result_id" = 3
GROUP BY "api2_testcaseresult"."result";

请注意“持续时间”如何不是“分组依据”子句的一部分。

标签: djangodjango-models

解决方案


您可以简单地附加第二个annotate()

qs = (TestCaseResult.objects
    .filter(run_result=run_result)
    .values('result')
    .annotate(result_count=Count('result'))
    .annotate(result_duration=Sum('duration'))
    )

这应该会为您提供所需的 SQL 查询。


推荐阅读