Django объявляет подзапрос для повторного использования?

Есть ли способ хранить подзапрос в django так же, как это делает SQL DELCARE?

У меня есть несколько вычислений с использованием подзапросов. Затем я ссылаюсь на эти подзапросы в дальнейших вычислениях.

Проблема в том, что после обращения к этим подзапросам, они "запускаются снова" и вызывают еще один огромный запрос select без необходимости.

Есть ли способ вызвать запрос один раз, а затем использовать его повторно?

Единственное условие - это то, что это должно быть сделано в одном запросе с использованием аннотаций.

Приведенный ниже пример - "fo_val" будет вызываться в дальнейшем несколько раз;

annotations = {
    'order_val': Sum('containerorderitem__order_cost'),

    'fo_deposit_paid': Coalesce(CwhInvoice.objects.filter(
        container_ref=OuterRef('factory_order__ref_no'),
        add_cost_code=7
    ).values('container_ref').annotate(
        total=Sum('total_amount')
    ).values('total'), Value(0)),

    'fo_val': FactoryOrderItem.objects.filter(
        factory_order_id=OuterRef('factory_order_id')
    ).values('order_cost').annotate(sum=Func('order_cost', function='SUM')).values('sum'),

    'fo_deposit_pct': Cast((F('fo_deposit_paid') / F('fo_val')) * 100, FloatField()),
}

self.model.objects.annotate(**annotations).values(etc)
Вернуться на верх