django - 需要帮助形成具有多个聚合的查询集
问题描述
我定义了以下模型:
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";
请注意“持续时间”如何不是“分组依据”子句的一部分。
解决方案
您可以简单地附加第二个annotate()
:
qs = (TestCaseResult.objects
.filter(run_result=run_result)
.values('result')
.annotate(result_count=Count('result'))
.annotate(result_duration=Sum('duration'))
)
这应该会为您提供所需的 SQL 查询。
推荐阅读
- typescript - 为什么允许调用泛型函数但不能创建变量
- python - 由于依赖关系,在 AWS Lambda 中导入模块时出错
- javascript - 如何使 JQuery/JQueryUI 与 React 兼容?
- android - 列表项布局未将项目显示为全宽
- java - 使用 Maven 着色插件着色传递依赖(番石榴)
- java - 当值大于零时如何验证五个TextField?
- css - 具有 14px 的 Roboto 导致不同尺寸的 chrome/firefox
- python - 初始化经过训练的 keras 网络的单层并获得预测
- python - KrbError: ('Principal not found in keytab', -1)
- bootstrap-4 - 通过更改箭头位置防止屏幕外弹出窗口