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

如何通过单条查询更新JSONField中指定主键的is_disabled字段?

单条查询更新JSONField中指定主键对应的is_disabled值

假设你的模型基于Django,以下分数据库给出单条查询完成更新的实现方案:

PostgreSQL(Django默认JSONField用jsonb)

先自定义封装PostgreSQL的jsonb_set函数,再循环构造更新表达式,最后执行单条更新:

from django.db.models import F, Value
from django.db.models.functions import Func

# 封装PostgreSQL的jsonb_set函数
class JsonbSet(Func):
    function = 'jsonb_set'
    arity = 3

# 你的主键集合
pk_set = {1, 2}
# 初始化更新表达式为原JSON字段
update_expr = F("your_json_field")

# 遍历主键,逐个设置对应is_disabled为True
for pk in pk_set:
    # 构造JSON路径,对应"1"->"is_disabled"层级
    path = Value(f'{{"{pk}", "is_disabled"}}')
    # 叠加更新表达式,第四个参数True允许路径不存在时创建(可选,你的场景路径已存在)
    update_expr = JsonbSet(update_expr, path, Value(True), True)

# 执行更新,替换...为你的过滤条件(比如更新特定实例或批量)
YourModel.objects.filter(...).update(your_json_field=update_expr)

MySQL

如果使用MySQL,调用其JSON_SET函数,实现逻辑类似:

from django.db.models import F, Value
from django.db.models.functions import Func

# 封装MySQL的JSON_SET函数
class JsonSet(Func):
    function = 'JSON_SET'

pk_set = {1, 2}
update_expr = F("your_json_field")

for pk in pk_set:
    # MySQL的JSON路径格式,比如$."1".is_disabled
    path = Value(f'$."{pk}".is_disabled')
    update_expr = JsonSet(update_expr, path, Value(True))

# 执行更新,替换...为你的过滤条件
YourModel.objects.filter(...).update(your_json_field=update_expr)

注意事项

  • 确保JSONField中的主键键名是字符串类型(比如示例里的"1"而非数字1),所以需要把pk转成字符串拼入路径
  • 单条update语句会一次性完成所有指定主键的is_disabled字段更新,符合"单条查询"的要求

内容的提问来源于stack exchange,提问作者hungry7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:18:20