それ自体が集計された 2 つの値でパーセンテージを計算しようとしています。私が何を求めているかを説明する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のドキュメントによると、これが進むべき道のように見えるということです:
元の QuerySet の各結果に対して注釈付きの結果を返す代わりに、values() 句を使用して結果セット […] で返される列を制約する場合、元の結果は指定されたフィールドの一意の組み合わせに従ってグループ化されます。 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