我有一个Django 2.2.23应用程序,运行在Python 3.9.4上。我有django扩展2.2.9。
我有一个具有django_extensions.db.fields.json.JSONField
属性的模型(AFAIK只是一个自动序列化的文本字段(。我提到这一点是因为当JSON被反序列化时,django扩展库会这样做:
def loads(txt):
value = json.loads(
txt,
encoding=settings.DEFAULT_CHARSET
)
return value
问题是import json
导入的库在以这种方式调用时给了我一个错误:
Python 3.9.4 (default, Apr 5 2021, 01:50:46)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import json
>>> json.loads("{}", encoding="UTF-8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 359, in loads
return cls(**kw).decode(s)
TypeError: __init__() got an unexpected keyword argument 'encoding'
>>>
最终的结果是,我无法从数据库中加载任何包含JSONField
的记录,因为JSONDecoder无法处理被传递的encoding
参数。
我的印象是Python的json库是simplejson。但从源代码来看,它确实处理encoding
。但如果我看一下"/usr/local/Cellar/python@3.9/3.9.4/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/init.py"(如上面错误中所述(,这个解码器肯定不会。
这显然是不正确的行为,但我不知道我需要升级什么才能实现正确的事情。
您看到此错误是因为参数encoding
已从Python 3.9中的json.loads
中删除(自Python 3.1以来已弃用(。
您正在使用的django扩展2.2.9版本于2020年3月发布,Python 3.9于2020年10月发布。
这个特殊的问题应该在django扩展3.0中得到修复,但Python 3.9只是在django-extensions 3.1.1中添加到测试套件中,所以我建议更新到最新版本。
由于encoding
参数已弃用,您可以尝试执行以下操作:
def loads(txt):
txt = txt.encode("utf-8")
value = json.loads(txt)
return value