Django ORM 获取两个串联列的平均值

Django ORM get average of two concatenated columns

我有 2 个模型

class Order:
  ...

我还有一个模型 Trade

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"))

Avg 不适用于两个(或更多)元素。但是,您可以通过以下方式模拟:

from django.db.models import Count, DecimalField, Sum
from django.db.models.functions import Coalesce

Order.objects.annotate(
    average_price=ExpressionWrapper(
        (<b>Coalesce(Sum(</b>'x_set__price'<b>), Value(0)) + Coalesce(Sum(</b>'y_set__price'<b>)</b>), Value(0)) /
        (<b>Coalesce(Count(</b>'x_set__price'<b>), Value(0)) + Coalesce(Count(</b>'y_set__price'<b>), Value(0))</b>),
        output_field=DecimalField(max_digits=5, decimal_places=2)
    )
)

我们因此确定值的 Sum,然后除以元素总数。 output_field 指定输出类型。