如何在Django上为同一查询集的每一行应用过滤器



我有一个模型Product,它使用键"父";。

这样,为了得到产品的父级,我只做product.parent,如果我想要产品的子级,我做product.product_set.all()

我想做的是对父产品的查询集进行注释,并将每个产品的库存与其子产品的库存相加。类似的东西:

qs = Product.objects.filter(is_parent=True)
qs = qs.annotate(stock_sum=Sum(Product.objects.filter(parent_id=F('id')).values_list['stock']))

这可能吗?它会导致很多查询吗?或者django知道用几个联接来处理这个问题的方法吗?

保存一个语法错误(values_list后面的方括号而不是圆括号(,这应该可以按预期工作。

这只会引发一个查询。注意,您可以通过访问查询集的.query属性来检查ORM生成的SQL(以下内容随后通过SQL漂亮的打印机运行(:

>>> str(qs.query)
SELECT
"yourapp_product"."id",
"yourapp_product"."parent_id",
"yourapp_product"."stock",
SUM((SELECT U0."stock" FROM "yourapp_product" U0 WHERE U0."parent_id" = (U0."id"))) AS "stock_sum"
FROM
"yourapp_product"
WHERE
"yourapp_product"."is_parent"
GROUP BY
"yourapp_product"."id",
"yourapp_product"."parent_id",
"yourapp_product"."stock";