Агрегация Django — выражение содержит смешанные типы. Вы должны установить output_field

Я пытаюсь выполнить запрос агрегации, и это мой код:

TicketGroup.objects.filter(event=event).aggregate(
                           total_group=Sum(F('total_sold')*F('final_price')))

У меня есть «total_sold» и «final_price» в объекте TicketGroup, и все, что я хочу сделать, это суммировать и умножать значения, чтобы получить общее количество проданных билетов всех TicketGroups вместе.

Все, что я получаю, это эта ошибка:

Выражение содержит смешанные типы. Вы должны установить output_field

Что я делаю неправильно, так как я называю «total_group» своим полем вывода?

Спасибо!


person Lara    schedule 23.07.2016    source источник


Ответы (2)


Под output_field Django подразумевает предоставление типа поля для результата Sum.

from django.db.models import FloatField, F
total_group=Sum(F('total_sold')*F('final_price'), output_field=FloatField())

должен сделать трюк.

person Todor    schedule 23.07.2016

Мне пришлось использовать что-то другое, чтобы мой запрос работал. Просто output_field не решит эту проблему. Мне нужно было простое разделение между двумя псевдонимами. Это вывод двух аннотаций.

from django.db.models import FloatField, ExpressionWrapper, F

distinct_people_with_more_than_zero_bill = Task.objects.filter(
    billable_efforts__gt=0).values('report__title').annotate(
    Count('assignee', distinct=True)).annotate(
    Sum('billable_efforts'))

annotate(yy=ExpressionWrapper(F('billable_efforts__sum') / F('assignee__count'), output_field=FloatField()))

Ключевым здесь является ExpressionWrapper. Без этого вы получите сообщение об ошибке: received non-expression(s)

Подсказка пришла к самой документации Django, в которой говорится:

Если поля, которые вы объединяете, относятся к разным типам, вам нужно указать Django, какое поле будет возвращено. Поскольку F() напрямую не поддерживает output_field, вам нужно будет обернуть выражение с помощью ExpressionWrapper.

Ссылка: https://docs.djangoproject.com/en/2.2/ref/models/expressions/

person Arindam Roychowdhury    schedule 20.06.2019