首页 > 解决方案 > 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_valueJSONField

    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,并且该列在数据库中定义为jsonie 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

标签: pythondjangopsycopg2

解决方案


推荐阅读