2017-09-11 20 views
1

我有兩個表,如下所示。Django中矩陣視圖'一對多'聚合

這些在'one(History.testinfoid)到許多(Result.testinfoid)'關係中。 (結果表是外部數據庫)

class History(models.Model): # default database 
    idx = models.AutoField(primary_key=True) 
    scenario_id = models.ForeignKey(Scenario) 
    executor = models.CharField(max_length=255) 
    createdate = models.DateTimeField() 
    testinfoid = models.IntegerField(unique=True) 

class Result(models.Model): # external (Result.objects.using('external')) 
    idx = models.AutoField(primary_key=True) 
    testinfoid = models.ForeignKey(History, to_field='testinfoid', related_name='result') 
    testresult = models.CharField(max_length=10) 

    class Meta: 
     unique_together = (('idx', 'testinfoid'),) 

所以,我想表達的「TestResult中」字段在結果列表中的計數。

它有一些條件,如'通過'或'失敗'。

我想表達每個條件的計數查詢集。喜歡這個。

[{ 'IDX':1, 'pass_count':10, 'FAIL_COUNT':5, '執行': '有人',...} ...
...
{」 idx':10,'pass_count':1,'fail_count':10,'executor':'someone',...}]

可能嗎?

+0

看看聚合文檔:https://docs.djangoproject.com/en/1.11/topics/db/aggregation/ –

+1

@KarimNGorjux我添加了一個更具體的標題,因爲它是一個更有趣的問題,說「閱讀文檔」。 – hynekcer

回答

0

這是一個兩級聚合其中第二級應顯示爲表列 - 「矩陣視圖」。

A)的Python環由所述第二電平( 「TestResult中」 來創建註釋列)。

from django.db.models import Count 
from collections import OrderedDict 


qs = (History.objects 
     .values('pk', 'executor', 'testinfoid',... 'result__testresult') 
     .annotate(result_count=Count('pk')) 
    ) 
qs = qs.filter(...).order_by(...) 

data = OrderedDict() 
count_columns = ('pass_count', 'fail_count', 'error_count', 
       'expected_failure_count', 'unexpected_success_count') 
for row in qs: 
    data.setdefault(row.pk, dict.fromkeys(count_columns, 0)).update(
     {(k if k != result_count else row['result__testresult'] + '_count'): v 
     for k, v in row_items() 
     if k != 'result__testresult' 
     } 
    ) 
out = list(data.values()) 

OrderedDict是用來保存order_by()

B)解在Django 1.11+ 子查詢(如果結果應該是一個查詢集。例如要被分選,或通過點擊一個管理視圖最後過濾,並且如果一個更復雜的查詢是可接受的,並且數列*_count非常低)。我可以使用子查詢編寫解決方案,但我不確定查詢是否足夠快,可以使用不同的數據庫後端。也許有其他人的答案。