我正在使用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}]
我到目前爲止工作的方法如下:
- 獲得的提交
- 不同的列表對於每個提交獲得唯一實例
- 對於每個實例使用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現在擁有的分組,但我不能很好地按照這種方式進行分組。我已經嘗試了兩種方式:
拉去結果的總結我的所有數據
TestResult.objects.filter(test_run__branch=branch).values('result').annotate(count=Count('result'))
[{ '計數':400, '結果': '封鎖'},{「計「:250,‘結果’:‘錯誤的’} ...]
第二個讓我爲每一個獨特的結果的總結,但總結沒有未組合成一本字典
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方式,然後我目前的實現。
它很有用。對於一個特定的提交,我試過我得到了: [{count:6,result:passed ...}] 當我應該得到: [{passed:5,failed:1 ...}] – Badger
對不起那。您能否爲我提供一些模擬數據庫數據? –
如果您想查看,我創建了一個測試項目。你可以在https://github.com/cgathuru/test中克隆它 – Badger