Celery存储数据到Django JSONField时触发JSONField导入错误如何解决
错误原因
- 你的Django版本低于3.1:Django官方原生跨数据库兼容的
JSONField是3.1版本才正式纳入django.db.models模块的,低于该版本的Django环境中无法从这个路径导入该字段。 - 如果你当前使用的是Django 2.2~3.0版本,且数据库为PostgreSQL,旧版本专属的PostgreSQL-only JSONField存放在
django.contrib.postgres.fields路径下,你当前的导入路径不对。
解决方案
方案1:升级Django到3.1及以上版本(推荐)
直接升级Django到稳定的高版本即可解决导入问题,同时可以使用兼容所有主流数据库(MySQL、PostgreSQL、SQLite等)的原生JSONField:
pip install --upgrade django>=3.2 # 建议升级到LTS版本3.2或者更高的稳定版
升级后你原来的导入语句无需修改即可正常运行。
方案2:适配低版本Django
如果你暂时无法升级Django,根据你使用的数据库选择对应方案:
- 若使用PostgreSQL数据库:修改
models.py中的导入语句,把JSONField的导入路径替换为PostgreSQL专属路径:
# 把原来的from django.db.models import TextField, JSONField, Model替换为下面的 from django.db.models import TextField, Model from django.contrib.postgres.fields import JSONField
- 若使用非PostgreSQL数据库(如MySQL、SQLite等):可以引入第三方包
django-jsonfield来实现相同功能:
先安装依赖:
pip install django-jsonfield
再修改导入语句:
from django.db.models import TextField, Model from jsonfield import JSONField
额外代码问题修正
你提供的tasks.py代码里还有两处明显错误需要修正:
- 没有定义变量
id就直接调用str(id),会抛出未定义异常,需要替换为你实际的业务id变量 res.append(content)中的res变量没有定义,直接运行会报错,建议删掉这行没用的代码,或者替换为你实际要操作的列表变量。
内容的提问来源于stack exchange,提问作者Marwen Aydi
相关产品推荐
相关产品推荐

