我正在尝试用两个本身聚合的值来计算百分比。解释我所追求的 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() 中的选择参数定义的任何字段都必须显式包含在 values() 子句中。但是,如果在 values() 之后使用了 extra() 子句,则 select 添加的字段将自动包含在内。
来源: http ://docs.djangoproject.com/en/dev/ref/models/querysets/#values