Django带条件求和查询实现咨询:转换MySQL条件求和语句
解决Django ORM实现带条件的Sum统计问题
嘿,我明白你的需求了!要把你那个MySQL查询转成Django ORM,关键是要学会用Case和When表达式来实现条件求和——这正是你之前卡住的地方,因为直接用Sum没法直接加等于判断。
具体实现步骤
首先,你需要导入Django ORM的几个核心表达式:
from django.db.models import Sum, Case, When, IntegerField
然后,就可以写出对应的ORM查询了:
result = Rating.objects.filter(applied_users=32500).aggregate( YES=Sum( Case( When(recommended='1', then=1), default=0, output_field=IntegerField() ) ), NO=Sum( Case( When(recommended='0', then=1), default=0, output_field=IntegerField() ) ) )
代码解释
Case+When组合相当于SQL里的条件判断:当recommended等于'1'时返回1,否则返回0;Sum会把这些1和0加起来,本质上就是统计符合recommended='1'的记录总数,和你原来的sum(recommended='1')效果完全一致;output_field=IntegerField()是为了明确指定返回值类型,避免Django自动推断可能出现的问题;- 最终
result会是一个字典,比如{'YES': 15, 'NO': 8},和你MySQL查询返回的结果结构对应。
额外提示
如果你的recommended字段在Django模型里是BooleanField(对应MySQL的tinyint类型),可以简化成:
YES=Sum(Case(When(recommended=True, then=1), default=0, output_field=IntegerField()))
这样就完美实现你要的统计效果啦!
内容的提问来源于stack exchange,提问作者Sandeep
相关产品推荐
相关产品推荐

