【发布时间】:2011-07-08 18:00:55
【问题描述】:
我正在尝试用两个本身聚合的值来计算百分比。解释我所追求的 SQL 查询如下:
SELECT (SUM(field_a) / SUM(field_b) * 100) AS percent
FROM myapp_mymodel
GROUP BY id
ORDER BY id
我尝试使用以下内容来构造一个 QuerySet,但不幸的是它不包含额外的字段:
MyModel.objects.values('id').annotate(
sum_field_a=Sum('field_a'),
sum_field_b=Sum('field_b')).extra(
select={'percent': 'sum_field_a / sum_field_b * 100'})
让我恼火的是——根据 Django 文档——这似乎是要走的路:
当使用 values() 子句时 约束列 在结果集中返回 […] 而不是返回 每个结果的注释结果 原来的QuerySet,原来的 结果根据分组 字段的独特组合 在 values() 子句中指定。一个 然后为每个提供注释 独特的群体;注释是 计算所有成员的 组。
来源: http://docs.djangoproject.com/en/dev/topics/db/aggregation/#values
如果在 extra() 子句之后使用 values() 子句,则 extra() 中的 select 参数定义的任何字段都必须显式包含在 values() 子句中。但是,如果在 values() 之后使用 extra() 子句,则 select 添加的字段将自动包含在内。
来源:http://docs.djangoproject.com/en/dev/ref/models/querysets/#values
【问题讨论】:
标签: sql django django-queryset extra