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
指定输出类型。
我有 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
指定输出类型。