我正在尝试使用两个聚合值计算百分比。以下是说明我所需内容的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()子句中指定的字段的唯一组合进行分组。然后为每个唯一组提供注释;注释是计算整个组成员的结果。如果在extra()子句之后使用values()子句,则extra()中定义的任何字段都必须明确包含在values()子句中。但是,如果在values()之后使用extra()子句,则由select参数添加的字段将自动包含在其中。