在Django中使用update_or_create向JSONField追加值的报错问题
解决Django中用update_or_create高效追加JSONField数组值的问题
你遇到的错误是因为直接用F("hobbies") + ["Music"]时,Django会把这个操作解析成数值加法,而非JSON数组的追加,导致数据库尝试把JSON转换成数值类型,触发类型错误。
要实现单次数据库访问完成追加,需要用Django提供的JSON数组操作函数,具体步骤如下:
导入对应的数据库函数
在代码文件顶部导入JSONArrayAppend:from django.db.models.functions import JSONArrayAppend修改
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
相关产品推荐
相关产品推荐

