使用Django的REGEXP_REPLACE多模式更新模型JSON字段报错求助
问题分析与解决方案
错误原因
你的正则表达式(name|description)": "(.*?)",存在两个关键问题:
- 强制匹配字段后的逗号,若目标字段是JSON的最后一个键值对(无尾随逗号),会匹配失败,且替换后会破坏JSON结构;
- 直接将JSON转为字符串用正则处理,容易因JSON格式的空格、换行等变化导致匹配异常,最终生成不符合语法的JSON字符串,触发解析错误。
解决方案
方案1:修正正则表达式(兼容JSON格式)
调整匹配模式,兼容字段后是逗号或JSON闭合括号的情况,替换时保留原分隔符,避免破坏JSON结构:
find_pattern = r'(name|description)": "(.*?)"(,|\s*})' repl_pattern = r'\1": "filler"\2' # 原更新代码不变,仅替换上述两个变量 Cast( Case( When( **{f'information__isnull': False}, then=Func( Cast(information, output_field=CharField()), Value(find_pattern), Value(repl_pattern), Value('g'), function='REGEXP_REPLACE', output_field=CharField(), ), ), default=None, ), output_field=JSONField(), )
方案2:使用原生JSON操作函数(更可靠)
如果使用PostgreSQL作为数据库,推荐直接用Django支持的PostgreSQL JSON函数修改字段,避免正则处理字符串的风险:
from django.db.models import Func, F, Value # 链式调用jsonb_set逐个修改目标键 Person.objects.update( information=Func( Func( F('information'), Value('{name}'), Value('"filler"'), function='jsonb_set' ), Value('{description}'), Value('"filler"'), function='jsonb_set' ) )
这种方法直接操作JSON结构,无需转换为字符串,完全避免JSON格式错误问题。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

