Использование Annotate & Artithmetic в подзапросе Django - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь улучшить мое понимание синтаксиса набора запросов 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 вместо запуска двух отдельных наборов запросов.Я думаю, что это разрешено, но я не уверен, правильно ли я понимаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...