Я пытаюсь рассчитать процент с двумя значениями, которые сами агрегируются. 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
Если вы используете предложение values () после предложения extra (), любые поля, определенные аргументом select в extra (), должны быть явно включены в предложение values (). Однако, если предложение extra () используется после values (), поля, добавленные в select, будут включены автоматически.
Источник: http://docs.djangoproject.com/en/dev/ref/models/querysets/#values