Как использовать OuterRef с фильтром _in

Я пытаюсь переделать запрос и не могу найти решение. Вот установка (упрощенная):

Объект OrderLine с количеством и товаром, а сам товар с запасом

class Product(models.Model):
    inventory_quantity = models.IntegerField()

class OrderLine(models.Model):
    product_id = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.IntegerField()

Я хочу аннотировать Product, чтобы узнать прогнозируемые запасы и использовать их позже в коде. У меня был такой код, который работал в Django 2:

subquery_projected_product = OrderLine.filter(
            product_id__in=OuterRef('id')
        ).annotate(
            qty=ExpressionWrapper(
                F('product__inventory_quantity') -
                OrderLine.sum_quantity_sql(),
                output_field=IntegerField()
            )
        ).values('qty')

products_queryset = Product.objects.all().
            annotate(
                nb_projected=Subquery(
                    subquery_projected_product,
                    output_field=IntegerField()
                )
        )

Но после перехода Django на версию 3 я столкнулся с этим: https://code.djangoproject.com/ticket/31135.

Если я правильно понимаю, это неправильный способ выполнения запроса и он больше не поддерживается.

Проще говоря, как я могу для каждого продукта указать сумму количества связанных линий заказа?

Спасибо и хорошего дня.

Я не думаю, что для этого нужно использовать SubQuery, вы можете просто использовать обычные аннотации

from django.db.models import Sum, F

Product.objects.annotate(
    order_total=Sum('orderline__quantity', default=0)
).annotate(
    projected=F('inventory_quantity') - F('order_total')
)
Вернуться на верх