如何使用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以了解预测的库存,并在稍后的代码中使用它。我有这段代码工作

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')
)

最新更新