python - Django 连接多个带注释的查询集

标签 python sql django

我有以下模型用于简单应用:

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_casesexecuted_cases 字段的 App 对象!

这真的很棒,因为您可以将 apps_extra 用作 django_tables2Column() 源并启用排序在那一栏!

关于python - Django 连接多个带注释的查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20686105/

相关文章:

python - Nuitka 错误在包 ' ' 中找不到 ' ' 作为绝对导入

python - python中的 “unpacking” nltk错误

php - 从 MySQL 中检索多行

python - 通过 SSH 连接到远程计算机并使用 Python 以 root 用户身份编辑文件

python - PyQt4 使用小部件移动 QTableWidget 行

sql - 如何将数据从SQL Server传输到mongodb(使用mongoose schema进行验证)

sql - Postgres - 是一组日期中的日期

Django 递归关系

python - django 中的 Model.id 和 Model.pk 有什么区别?

python - 根据方法返回不同的响应或数据 - Django rest framework