如何在Django中使用Subquery实现关联表COUNT统计?
可以用Django Subquery实现,无需原生SQL
完全可以通过Django的Subquery表达式实现你要的查询逻辑,不需要依赖原生SQL。以下是具体实现代码:
首先导入需要的模块:
from django.db.models import Subquery, OuterRef, Count
然后构造子查询并执行主查询:
# 构造子查询:统计每个冰淇淋的有效配料数量 topping_count_subquery = Topping.objects.filter( ice_cream=OuterRef('pk'), is_active=True ).values('ice_cream').annotate( count=Count('id') ).values('count') # 主查询:给每个冰淇淋添加total_toppings字段 ice_creams = IceCream.objects.annotate( total_toppings=Subquery(topping_count_subquery) ).all()
代码说明:
OuterRef('pk')用来引用主查询中IceCream对象的主键,关联子查询的ice_cream外键,对应你目标SQL里的topping.ice_cream = ice_cream.id逻辑。values('ice_cream').annotate(count=Count('id'))对子查询结果按ice_cream分组并统计数量,确保每个冰淇淋只返回一个计数结果,避免子查询返回多条数据报错。- 最后通过
annotate把Subquery的结果作为自定义字段total_toppings附加到每个IceCream对象上。
如果需要让没有有效配料的冰淇淋的total_toppings默认显示为0(而非None),可以用Coalesce函数包装Subquery:
from django.db.models import Coalesce ice_creams = IceCream.objects.annotate( total_toppings=Coalesce(Subquery(topping_count_subquery), 0) ).all()
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

