繁体   English   中英

Django计算字段中的唯一项目并通过字段选择按父字段分组

[英]Django count unique items in field and group by parent field with field selection

我正在使用 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}]

我到目前为止工作的方法如下:

  1. 获取不同的提交列表
  2. 对于每个提交获得唯一的实例
  3. 对于每个实例,对所有匹配实例的结果使用 python Counter 来获取实例的摘要。 附加到列表中。

我的实际实现如下。 数据集由查询参数过滤,即分支

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 现在拥有的分组,但我不太能够以这种方式对其进行分组。 我尝试了两种方法:

  1. 为我提供了所有数据的结果摘要

     TestResult.objects.filter(test_run__branch=branch).values('result').annotate(count=Count('result'))

    [{'count': 400, 'result': 'blocked'}, {'count': 250, 'result': 'errored'} ...]

  2. 第二个给了我每个唯一结果的摘要,但该摘要没有合并到字典中

     TestResult.objects.filter(test_run__branch=branch).values('result', 'test_run__commit', 'test_run__instance').annotate(count=Count('result'))

    [{'count': 3, 'result': 'blocked', 'instance': 5, 'commit': 2400}, {'count': 6, 'result: 'errored', 'instance': 5, '提交':2400}....]

这两个是我最接近的两个,但它们并不完全在那里。 我知道当您使用带有前面的值的 annotate 时,这些值决定了分组,但是字段选择会发生什么? 在进行汇总时,如何同时进行字段选择和分组? 有没有比我目前的实现更好的 Django 方式。

我认为这可以解决问题:

TestRun.objects.
filter(branch=branch).values('commit', 'requester', 'instance').
annotate(result=F('testresult__result'), count=Count('testresult__result'))

让我知道它是否对你有用!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM