Использование extra () для ValuesQuerySet в Django

Я пытаюсь вычислить процент с двумя значениями, которые сами суммируются. 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 ​​(). An аннотация затем предоставляется для каждого уникальная группа; аннотация вычисляется по всем членам группа.

Источник: http://docs.djangoproject.com/en/dev/topics/db/aggregation/#values ​​

Если вы используете предложение values ​​() после предложения extra (), любые поля, определенные аргументом select в extra (), должны быть явно включены в предложение values ​​(). Однако, если предложение extra () используется после values ​​(), поля, добавленные с помощью select, будут включены автоматически.

Источник: http://docs.djangoproject.com/en/dev/ref / models / querysets / # values ​​

8
задан jnns 16 March 2011 в 00:16
поделиться