2016-06-24 3 views
1

Если у меня есть агрегат, могу ли я получить среднее значение значений в запросе, не вычисляя его в памяти python?Как вычислить среднее значение совокупности в django

from django.db.models import F, Sum, FloatField, Avg 
Model.objects.filter(...)\ 
    .values('id')\ 
    .annotate(subtotal=Sum(...math here...), output_field=FloatField())\ 
    .annotate(total=Avg(F('subtotal'))) #this line throws a FieldError 

Есть ли способ, чтобы получить Avg из subtotal значений в запросе? Это дает мне ошибку, что мне не разрешено вычислять Avg на совокупности («subtotal»), но я не могу заменить группу .values('id'), потому что внутри операций .annotate(...math here...) нет distributive через объекты Model.

ответ

2
from django.db.models import F, Sum, FloatField, Avg 
Model.objects.filter(...)\ 
    .values('id')\ 
    .annotate(subtotal=Sum(...math here..., output_field=FloatField()))\ 
    .aggregate(total=Avg(F('subtotal'))) 

Aggregating annotations. Примечание: output_field - параметр Sum, а не annotate().

+0

Большое спасибо, отлично работает. – Escher

+0

У меня такая же проблема, но мне нужно усреднять по нескольким (уже) агрегированным полям. Что-то вроде '.aggregate (total = Avg (F ('subtotal_1'), F ('subtotal_2'), F ('subtotal_3')))', но он жалуется, что 'subtotal_1' - это совокупность ... как решить эту проблему ? [Вот аналогичный вопрос.] (Http://stackoverflow.com/questions/34911474/django-aggregation-sum-then-average) –

Смежные вопросы