You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:56:08