Django ORM получает среднее значение двух объединенных столбцов

#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 бы то, что не является делением на нулевой случай 🙂