Django计算字段中的唯一项目和按字段分组的字段选择

时间:2017-03-07 01:35:49

标签: python mysql django django-queryset

我正在使用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对所有匹配实例的结果进行实例汇总。附加到列表中。
  4. 我的实际实施如下。 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现在拥有的分组,但是我不能用这种方式对它进行分组。我尝试了两种方法:

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

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

      [{'count':400,'结果':'封锁'},{'计数':250,'结果':'错误'} ...]

    2. 第二个为我提供了每个独特结果的摘要,但摘要并未合并到字典中

       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} ....]

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

1 个答案:

答案 0 :(得分:0)

我认为这会解决问题:

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

让我知道它是否适合你!