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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:02:51