我有一个模型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";