У меня есть несколько моделей Django с отношениями FK между ними:
from django.db import models
class Order(models.Model):
notes = models.TextField(blank=True, null=True)
class OrderLine(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE)
quantity = models.PositiveIntegerField()
price = models.DecimalField(max_digits=8, blank=True, decimal_places=2)
Для данной Линии Заказа вы можете рассчитать ее общее количество как цену:
def get_order_line_total(order_line):
return order_line.quantity * order_line.price
Для данного ордера вы можете рассчитать его итоговую сумму как сумму итогов по строкам ордеров:
def get_order_total(order):
order_total = 0
for orderline_for in order.orderline_set.all():
order_total += (order_line_for.quantity * order_line_for.price)
return order_total
Я хочу аннотировать эти итоги в наборах запросов, чтобы я мог их фильтровать, сортировать и т. Д.
Для моделей OrderLine я нашел это довольно просто:
from django.db.models import F, FloatField, Sum
annotated_orderline_set = OrderLine.objects.annotate(orderline_total=Sum(F('quantity') * F('price'), output_field=FloatField()))
Теперь я хочу аннотировать итоги в наборе запросов Order.objects. Я думаю, мне нужно будет использовать подзапрос, но я не могу заставить его работать.
Я думаю (не работает):
from django.db.models import F, FloatField, OuterRef, Subquery, Sum
Order.objects.annotate(
order_total=Subquery(
OrderLine.objects.filter(
order=OuterRef('pk')
).annotate(
orderline_total=Sum(F('quantity') * F('price'), output_field=FloatField())
).values(
'orderline_total'
).aggregate(
Sum('orderline_total')
)['orderline_total__sum']
)
)
# Not working, returns:
# ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
Как я мог решить это?