我正在使用Django 1.10,python 2.7,mysql,我正在尝试获取特定字段中每个唯一值的计数,但我希望每个父实例的摘要计数。我是Django和数据库设计的新手,所以如果我的结构错了,请告诉我。
即。我在这里有两个模型
TestRun:
branch - Branch test was run on - charField
requester - Who initiated test - charField
commit - What commit id it is. - integerField
instance - differentiate between rerun of same commit - integerField
每个Testrun都可以有多个测试结果
TestResult:
testrun - foreign key
testcase = charField
commit - same as in test run - duplicated for performance reasons
result = charField i.e pass, fail, blocked, errored etc
现在我希望按实例获得结果摘要: 即。
[{instance: 5, commit: 28000, resquester: bob, pass: 5, fail: 4, blocked: 4, errored: 6},
{instance: 500, commit: 28100, requester: sally, pass: 2, fail:3, blocked: 8, errored: 3}]
到目前为止我所使用的方法如下:
我的实际实施如下。 data_set由查询参数(即分支
)过滤commits = data_set.values_list('commit', flat=True).distinct()
for commit in commits:
commit_data = data_set.filter(commit=commit).prefetch_related('testrun')
instances = set()
for tr in commits:
instances.add((tr.test_run.instance, tr.test_run.id))
for instance, tr_id in instances:
summary = dict(Counter(obj.result for obj in commit_data if obj.testrun.instance == instance))
data.append({'commit': commit, 'instance': instance, 'summary': summary, 'tr_id': tr_id})
代码工作正常但它并没有真正扩展。我已经研究过Django现在拥有的分组,但是我不能用这种方式对它进行分组。我尝试了两种方法:
为我提供了所有数据的结果摘要
TestResult.objects.filter(test_run__branch=branch).values('result').annotate(count=Count('result'))
[{'count':400,'结果':'封锁'},{'计数':250,'结果':'错误'} ...]
第二个为我提供了每个独特结果的摘要,但摘要并未合并到字典中
TestResult.objects.filter(test_run__branch=branch).values('result', 'test_run__commit', 'test_run__instance').annotate(count=Count('result'))
[{'count':3,'结果':'已屏蔽','实例':5,'提交':2400}, {'count':6,'结果:'错误','实例':5,'提交':2400} ....]
这两个是我最接近的两个,但它们并不完全存在。我知道当你使用带有前面值的注释时,这些值决定了分组,但是字段选择会发生什么?在进行摘要时,如何同时进行字段选择和分组?有没有比当前实现更好的Django方式。
答案 0 :(得分:0)
我认为这会解决问题:
TestRun.objects.
filter(branch=branch).values('commit', 'requester', 'instance').
annotate(result=F('testresult__result'), count=Count('testresult__result'))
让我知道它是否适合你!