我有两张桌子如下。
这些是在(一个(历史。测试)到很多(结果.testinfoid)'关系。 (结果表是外部数据库)
class History(models.Model): # default database
idx = models.AutoField(primary_key=True)
scenario_id = models.ForeignKey(Scenario)
executor = models.CharField(max_length=255)
createdate = models.DateTimeField()
testinfoid = models.IntegerField(unique=True)
class Result(models.Model): # external (Result.objects.using('external'))
idx = models.AutoField(primary_key=True)
testinfoid = models.ForeignKey(History, to_field='testinfoid', related_name='result')
testresult = models.CharField(max_length=10)
class Meta:
unique_together = (('idx', 'testinfoid'),)
所以,我想通过' testresult'表达计数。结果表中的字段。
它有一些条件,例如' Pass'或者'失败'
我想为每个条件表达一个计数查询集。像这样。
[{' idx':1,' pass_count':10,' fail_count':5,' executor':'某人',...} ...
...
{' idx':10,' pass_count':1,' fail_count':10,'执行者':'某人' ;,...}]
有可能吗?
答案 0 :(得分:0)
这是两级聚合,其中第二级应显示为表格列 - " 矩阵视图"。
A)使用 Python循环的解决方案,通过第二级创建带注释的列(" testresult")。
from django.db.models import Count
from collections import OrderedDict
qs = (History.objects
.values('pk', 'executor', 'testinfoid',... 'result__testresult')
.annotate(result_count=Count('pk'))
)
qs = qs.filter(...).order_by(...)
data = OrderedDict()
count_columns = ('pass_count', 'fail_count', 'error_count',
'expected_failure_count', 'unexpected_success_count')
for row in qs:
data.setdefault(row.pk, dict.fromkeys(count_columns, 0)).update(
{(k if k != result_count else row['result__testresult'] + '_count'): v
for k, v in row_items()
if k != 'result__testresult'
}
)
out = list(data.values())
课程OrderedDict
用于保存order_by()
。
B)在Django 1.11 + 中使用子查询的解决方案(如果结果应该是一个查询集。例如,最后在管理视图中通过单击进行排序或过滤,并且如果可以接受更复杂的查询,并且列*_count
的数量非常少。)。我可以用子查询编写一个解决方案,但我不确定查询是否足够快,具有不同的数据库后端。也许是其他人的答案。