我有以下模型用于简单应用:
class App(models.Model):
name = models.CharField(max_length=60)
class TestCase(models.Model):
title = models.CharField(max_length=500)
app = models.ForeignKey('apps.App', blank=True)
class Run(models.Model):
timestamp = models.DateTimeField()
value = models.FloatField()
test_case = models.ForeignKey(TestCase)
例如,我想计算特定运行中已执行的案例和总案例:
>>> # r is instance of Run
>>> cases_ids = r.values('test_case').distinct()
>>> executed_cases = TestCase.objects.filter(pk__in=cases_ids)
>>> executed_cases_stat = executed_cases.values('app__name').annotate(dcound=Count('app__name'))
[{'executed_cases': 1, 'app__name': u'App1'}, {'executed_cases': 3, 'app__name': u'App2'}]
>>> all_cases_stat = TestCase.objects.all().values('app__name').annotate(total_cases='app__name')
[{'total_cases': 5, 'app__name': u'App1'}, {'total_cases': 7, 'app__name': u'App2'}, {'total_cases': 12, 'app__name': u'App3'}]
>>>
>>> # I want to get this result:
[{'executed_cases': 1, 'total_cases': 5, 'app__name': u'App1'}, {'executed_cases': 3, 'total_cases': 7, 'app__name': u'App2'}, {'executed_cases': 0, 'total_cases': 12, 'app__name': u'App3'}]
我知道可以通过 SQL 实现(它可能看起来很难看):
select
simple_app.name
, tc.total_cases
, ce.cases_executed
from apps_app
join (
select count(id) as total_cases, app_id
from simple_testcase
group by app_id) tc
on simple_app.id = tc.app_id
join(
select count(id) as cases_executed, app_id
from simple_testcase
where id in (select test_case_id
from simple_run where run_id = 1)
group by app_id) ce
on apps_app.id = ce.app_id
有没有办法不用原始sql或在python中迭代就可以做到这一点?
最佳答案
大多数时候,我想做一些用注释看似不可能完成的事情,我会使用额外
( https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.extra )
例如,在您的情况下,您可以执行以下操作:
apps_extra = App.objects.all().extra (select={ 'total_cases': """ select count(id) from simple_testcase where simple_app.id = simple_testcase.app_id """, 'executed_cases': """ # the same with your second nested query """, })
现在,apps_extra
将包含带有 total_cases
和 executed_cases
字段的 App
对象!
这真的很棒,因为您可以将 apps_extra
用作 django_tables2
的 Column()
源并启用排序在那一栏!
关于python - Django 连接多个带注释的查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20686105/