8

それ自体が集計された 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

4

3 に答える 3

0

extra() 句の後に values() 句を使用する場合、extra() の select 引数によって定義されたフィールドは、values() 句に明示的に含める必要があります。

ソース: http://docs.djangoproject.com/en/dev/ref/models/querysets/#values

選択に追加された「パーセント」フィールドは、値句に明示的に追加でき、クエリセットに追加する必要があります。

MyModel.objects.annotate(
              sum_field_a=Sum('field_a'),
              sum_field_b=Sum('field_b')).extra(
              select={'percent': 'sum_field_a / sum_field_b * 100'}
         ).values('id', 'percent')
于 2011-03-13T14:32:05.117 に答える