2017-09-11 3 views
1

私は以下のような2つのテーブルを持っています。Djangoの行列ビューのための集計 'one to many'

これらは「1つ(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

2レベル集約ここで、第2レベルは表の列として表示する必要があります。「マトリックス表示」です。

A)は、第2レベル( "testresult" によって注釈を持つ列を作成するPythonのループ溶液)。

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()) 

クラスOrderedDictorder_by()を保存するために使用されます。ジャンゴ1.11+(中サブクエリを持つB)ソリューション

結果はクエリセットである必要があります。例えばクリックすることによってソートまたは管理ビューで最後に濾過すること、およびより複雑なクエリが許容され、数ある場合列の*_countは非常に低いです。)。サブクエリで解決策を書くことはできますが、クエリが異なるデータベースバックエンドで十分高速であるかどうかはわかりません。たぶん誰か他の人が答えます。