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

在Django中使用update_or_create向JSONField追加值的报错问题

解决Django中用update_or_create高效追加JSONField数组值的问题

你遇到的错误是因为直接用F("hobbies") + ["Music"]时,Django会把这个操作解析成数值加法,而非JSON数组的追加,导致数据库尝试把JSON转换成数值类型,触发类型错误。

要实现单次数据库访问完成追加,需要用Django提供的JSON数组操作函数,具体步骤如下:

  1. 导入对应的数据库函数
    在代码文件顶部导入JSONArrayAppend:

    from django.db.models.functions import JSONArrayAppend
    
  2. 修改update_or_create的调用逻辑
    用JSONArrayAppend替代直接的加法操作,它会调用数据库原生的JSON数组追加方法,在数据库层面完成操作:

    user_profile, created = UserProfile.objects.update_or_create(
        user=user,
        defaults={
            "hobbies": JSONArrayAppend(F("hobbies"), "Music")
        }
    )
    

原理说明

  • JSONArrayAppend是Django 3.1及以上版本支持的函数,会根据你使用的数据库(比如MySQL、PostgreSQL)自动适配对应的原生JSON操作(MySQL用JSON_ARRAY_APPEND,PostgreSQL用jsonb_array_append)。
  • 当创建新实例时,F("hobbies")会引用字段的默认值(空列表),JSONArrayAppend会直接把值追加进去,最终得到["Music"]。
  • 当更新已有实例时,函数会直接在数据库中对现有JSON数组执行追加,全程只触发一次数据库查询,避免了先获取再保存的两次访问。

低版本Django兼容方案

如果你的Django版本低于3.1,或者需要更灵活的JSON操作,可以直接使用RawSQL调用数据库原生函数,以PostgreSQL为例:

from django.db.models import RawSQL, F

user_profile, created = UserProfile.objects.update_or_create(
    user=user,
    defaults={
        "hobbies": RawSQL("jsonb_array_append(%s, %s)", (F("hobbies"), "Music"))
    }
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:44:55