在Django DRF中使用When与GreaterThan时遇SQL语法错误如何解决?
Django条件更新时SQL语法错误的解决办法
你遇到的错误是因为直接在update()里使用When子句不符合Django条件表达式的语法要求——When必须被Case包裹才能生成合法的SQL语句,单独使用会导致SQL解析出错。
修正后的代码
首先确保导入所需的类:
from django.db.models import Case, When, GreaterThan, F
然后修改更新逻辑:
ExampleModel.objects.filter(tic=request.data['tic']).update( last_high=Case( When(GreaterThan(F('last_high'), request.data['high']), then=0), default=F('last_high') # 不满足条件时保持原数值 ) )
代码说明
Case作为条件表达式的容器,会根据内部When的判断结果返回对应值default=F('last_high')是必须的:如果不加,不满足条件的记录会把last_high设为NULL,加上后会保留原字段值F('last_high')用于引用数据库中当前记录的last_high字段值,避免把Python层面的数值硬编码进去
额外注意事项
- 确保
request.data['high']的数值类型和ExampleModel中last_high字段的类型一致(比如都是整数或浮点数),否则可能出现隐性的类型错误 - 这种写法是数据库层面的批量更新,比先查询实例再逐个
save()高效得多
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

