Я пытаюсь улучшить мое понимание синтаксиса набора запросов Django и надеюсь, что кто-то может помочь мне проверить мое понимание.
Может ли это:
total_packed = (
PackingRecord.objects.filter(
product=OuterRef('pk'), fifolink__sold_out=False
).values('product') # Group by product
.annotate(total=Sum('qty')) # Sum qty for 'each' product
.values('total')
)
total_sold = (
FifoLink.objects.filter(
packing_record__product=OuterRef('pk'), sold_out=False
).values('packing_record__product')
.annotate(total=Sum('sale__qty'))
.values('total')
)
output = obj_set.annotate(
sold=Subquery(total_sold[:1]),
packed=Subquery(total_packed[:1]),
).annotate(
in_stock=F('packed') - F('sold')
)
быть безопасно сведено к этому:
in_stock = (
FifoLink.objects.filter(
packing_record__product=OuterRef('pk'), sold_out=False
).values('packing_record__product')
.annotate(total=Sum(F('sale__qty')-F('packing_record__qty')))
.values('total')
)
output = obj_set.annotate(
in_stock=Subquery(total_sold[:1]),
)
По сути, я пытаюсь переместить выполняемую математику во внешнем .annotate()
в сам набор запросов, используя отношение fk вместо запуска двух отдельных наборов запросов.Я думаю, что это разрешено, но я не уверен, правильно ли я понимаю.