如何通过单条查询更新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
相关产品推荐
相关产品推荐

