python - Django 3.1 JSONField 尝试反序列化字典
问题描述
我在使用新django.db.models.JSONField
出现的列时遇到问题,该列从已经反序列化的数据库中返回,即已经是dict
. 该模型尝试再次反序列化该值,从而导致异常。
TypeError: the JSON object must be str, bytes or bytearray, not dict
此异常是从类定义的方法中的json.loads
调用中引发的。from_db_value
JSONField
def from_db_value(self, value, expression, connection):
if value is None:
return value
try:
return json.loads(value, cls=self.decoder)
except json.JSONDecodeError:
return value
我们正在运行 postgres,并且该列在数据库中定义为json
ie not jsonb
。我的模型的列jsonb
似乎没有这个错误。
当模型上的列保存为字符串时,我似乎没有问题。仅当列是dict
.
class MyModel(models.Model):
data = models.JSONField()
m1 = MyModel(data=json.dumps({"key": "value"})
m1.save()
m1.refresh_from_db()
m2 = MyModel(data={"key": "value")
m2.save()
m2.refresh_from_db() # Exception thrown here
我的猜测是在这种情况下它被双重编码。无论是什么导致它被解码为 adict
正在解码它,然后它dict
在模型级别被解码为 a 。
>>> import json
>>> a = json.dumps({"key": "value"})
>>> a
'{"key": "value"}'
>>> json.dumps(a)
'"{\\"key\\": \\"value\\"}"'
我什至尝试过使用 Postgres 特定字段,但也有同样的问题。我们的数据库中已经有导致此问题的记录,因此我无法保存带有该值的列json.dumps
。无论如何,我什至认为这不能解决问题。
依赖项
Django==3.1.3
psycopg2==2.8.6
解决方案
推荐阅读
- reactjs - React Native - 如何更改一个元素的颜色?
- spring-boot - oauth2-oidc-sdk ParseException:“不接受无算法”
- javascript - 如何阻止我的团队在 React 中使用原始字符串作为 JSX 子项?
- regex - 在记事本++中以n个字符完成整个单词的拆分短语
- sql - MariaDB:COUNT DISTINCT 是否被窃听?
- c# - 使用方法转义 XML 时出现 System.OutOfMemoryException
- java - 使用 jsoup 解析 londonstockexchange 页面
- java - 如何找到价格的平均值?
- css - 将导航栏定位在页面顶部但在主要内容上失去可点击性
- ruby - 查找一个项目是否在数组中的另一个项目之前