2017-03-07 57 views
0

我正在使用Django 1.10,python 2.7,mysql和我試圖獲取每個唯一值在特定字段中的計數,但是我想每個父實例的總計數。我對Django和數據庫設計相當陌生,所以請讓我知道如果我的結構錯了。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計數器匹配例如獲得例如彙總所有結果。附加到列表。

我的實際執行情況如下。 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')) 
    

    [{ '計數':400, '結果': '封鎖'},{「計「:250,‘結果’:‘錯誤的’} ...]

  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 ,'commit':2400} ....]

這兩個是我最接近的兩個,但他們並不完全在那裏。我知道,當您使用帶有值的批註時,值會確定分組,但字段選擇會發生什麼情況?在進行總結時,如何同時選擇字段和分組?有沒有更好的Django方式,然後我目前的實現。

回答

0

我認爲這將這樣的伎倆:

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

讓我知道,如果它爲你工作!

+0

它很有用。對於一個特定的提交,我試過我得到了: [{count:6,result:passed ...}] 當我應該得到: [{passed:5,failed:1 ...}] – Badger

+0

對不起那。您能否爲我提供一些模擬數據庫數據? –

+0

如果您想查看,我創建了一個測試項目。你可以在https://github.com/cgathuru/test中克隆它 – Badger