#django #django-orm
#джанго #django-orm
Вопрос:
У меня есть 2 модели
class Order:
...
а также у меня есть модель торговли
class Trade:
x = FK(Order, related_name="x_set")
y = FK(Order, related_name="y_set")
price = Decimal
Мне нужно рассчитать для каждого заказа среднее значение всех значений x_set__price и y_set__price.
Я пробовал что-то подобное, но это не работает
Order.objects.annotate(average_price=Avg("x_set__price", "y_set__price"))
Ответ №1:
Avg
не работает с двумя (или более) элементами. Однако вы можете эмулировать это с помощью:
from django.db.models import Count, DecimalField, Sum
from django.db.models.functions import Coalesce
Order.objects.annotate(
average_price=ExpressionWrapper(
(Coalesce(Sum('x_set__price'), Value(0)) Coalesce(Sum('y_set__price')), Value(0)) /
(Coalesce(Count('x_set__price'), Value(0)) Coalesce(Count('y_set__price'), Value(0))),
output_field=DecimalField(max_digits=5, decimal_places=2)
)
)
таким образом, мы определяем Sum
количество значений и делим их на общее количество элементов. output_field
Указывает, каков тип вывода.
Комментарии:
1. Спасибо, все работает нормально! Но что, если сумма чисел будет равна 0? Я получу
division by zero
сообщение об ошибке2. Это дало
0/n
бы то, что не является делением на нулевой случай 🙂