Django models增加JSONField字段

应用场景

有时候我们需要把一个 字典或列表 直接存储到数据库,取出来用的时候,又可以自动转换成 字典或列表

解决方案

  • 对于使用 django3.x 版本的用户,可以直接引用 models 自带的 JSONField
  • 对于使用 django2.x 版本或更低版本的用户,可以使用以下扩展包:
    - django-mysql 不做解释,直接看文档就行,很简单的
    - django-jsonfield-backport 官网说仅支持django2.2,没具体试过,不过django2.2.17是可以用的
    - django-mysql-fields 此包是作者自己封装的 JSONField, 但版本仅支持django1.x; 不过没关系,稍做修改django2.x也是可以用的,见下
    - jsonfield 此包也挺好用,admin后台自动格式化json

tips:

  • django-mysql、django-jsonfield-backport 需要mysql5.7以上版本的支持;django-mysql-fields、 jsonfield 不需要
  • 总之, 不需要自己写封装 JSONField(),网上有很多优秀的包,我们只需拿来用就可以了, 点我 可以查看更多关于 JSONField 的可用包

其他

django-mysql-fields 修改支持django2.x 如下:

# 此包安装的时候,不需要pip,直接github下载放在你自己项目的根目录就行,也不需注册APPS
# 此包在admin后台detail渲染的时候,把json进行了格式化,非常人性化
# ./django_mysql_fields/widgets/jsonfield.py

class FormattedJsonWidget(widgets.Textarea):
    """
    Overrides JSONField form widget to display formatted JSON text.
    """
    def render(self, name, value, attrs=None, renderer=None):      # 增加renderer参数
        value = json.dumps(json.loads(value), indent=2)
        return super().render(name, value, attrs, renderer=None)

在使用 django-jsonfield-backport 的时候,遇到了下面的报错

File "E:\yuemia\TianQing\venv\lib\site-packages\django\db\models\query.py", line 72, in __iter__
  for row in compiler.results_iter(results):
File "E:\yuemia\TianQing\venv\lib\site-packages\django\db\models\sql\compiler.py", line 1086, in apply_converters
  value = converter(value, expression, connection)
File "E:\yuemia\TianQing\venv\lib\site-packages\django_jsonfield_backport\models.py", line 111, in from_db_value
  if connection.features.has_native_json_field and self.decoder is None:
AttributeError: 'DatabaseFeatures' object has no attribute 'has_native_json_field'

解决如下:

INSTALLED_APPS = [
    ...
    "django_jsonfield_backport",
]
posted @ 2020-12-12 17:17  ugvibib  阅读(822)  评论(0编辑  收藏  举报