应用场景
有时候我们需要把一个 字典或列表 直接存储到数据库,取出来用的时候,又可以自动转换成 字典或列表。
解决方案
- 对于使用
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
的可用包。
# 此包安装的时候,不需要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",
]
转发自
https://www.cnblogs.com/ugvibib/p/14125369.htmlhttps://www.cnblogs.com/ugvibib/p/14125369.html