Django 3.0.5中使用models.JSONField报错AttributeError如何解决?
解决Django 3.0.5中
JSONField不存在的问题 错误原因
Django 3.0.x版本的django.db.models中并没有内置JSONField,这个字段是从Django 3.1版本才正式成为内置字段的,所以在3.0.5版本中调用会触发AttributeError。
解决方案
方案一:升级Django到3.1及以上版本
这是最简便的解决方式,直接更新依赖版本:
- 修改你的
requirements.txt文件,将Django版本改为3.1或更高(选择兼容现有依赖的稳定版本):
Django>=3.1,<4.0 django-cors-headers==3.2.1 djangorestframework==3.11.0
- 重新安装依赖:
pip install -r requirements.txt
升级后即可正常使用models.JSONField。
方案二:不升级Django,使用第三方JSON字段库
如果因项目限制无法升级Django,可以使用第三方库django-jsonfield:
- 安装该库:
pip install django-jsonfield
- 在模型中导入并使用:
from jsonfield import JSONField class WarehouseTablePreferences(models.Model): owner = models.ForeignKey(User, on_delete=models.PROTECT) column_preferences = JSONField(default=dict)
方案三:用TextField手动实现JSON序列化(不推荐)
如果不想引入第三方库,也可以用TextField结合JSON序列化模拟:
import json from django.db import models from django.core.exceptions import ValidationError def validate_json(value): try: json.dumps(value) except TypeError: raise ValidationError("Invalid JSON format") class WarehouseTablePreferences(models.Model): owner = models.ForeignKey(User, on_delete=models.PROTECT) column_preferences = models.TextField(default='{}', validators=[validate_json]) @property def column_preferences_dict(self): return json.loads(self.column_preferences) @column_preferences_dict.setter def column_preferences_dict(self, value): self.column_preferences = json.dumps(value)
这种方式需要手动处理序列化和反序列化,便捷性不如前两种方案,仅作为临时替代。
内容的提问来源于stack exchange,提问作者Rahul Sharma
相关产品推荐
相关产品推荐

