聚合在一对多的'用于Django中的矩阵视图

时间:2017-09-11 01:28:53

标签: django orm django-queryset

我有两张桌子如下。

这些是在(一个(历史。测试)到很多(结果.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'表达计数。结果表中的字段。

它有一些条件,例如' Pass'或者'失败'

我想为每个条件表达一个计数查询集。像这样。

  

[{' idx':1,' pass_count':10,' fail_count':5,' executor':'某人',...} ...
  ...
   {' idx':10,' pass_count':1,' fail_count':10,'执行者':'某人' ;,...}]

有可能吗?

1 个答案:

答案 0 :(得分: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的数量非常少。)。我可以用子查询编写一个解决方案,但我不确定查询是否足够快,具有不同的数据库后端。也许是其他人的答案。