为什么从django.contrib.postgres.fields.JSONField返回的数据是一个字符串?

时间:2016-10-31 18:25:54

标签: python django postgresql python-3.x

环境:

  • Django 1.9.10
  • psycopg2 2.6.2
  • 通过Homebrew在macOS Sierra上安装的PostgreSQL 9.5.4
  • 通过Homebrew安装的Python 3.5.2

示例模型:

from django.db import models
from django.contrib.postgres.fields import JSONField


class Foo(models.Model):
    data = JSONField()

当我尝试创建一个对象时,一切都按预期工作:

from myapp.models import Foo
x = Foo()
x.data = {'some key': 'some value'}
x.save()

但是,当我尝试检索该数据时,.data属性的值是一个字符串:

from myapp.models import Foo
x = Foo.objects.order_by('-id')[0]
# returns "{'some key': 'some value'}"
x.data
# returns <class 'str'>
type(x.data)

我的问题:如何取回dict以便我可以操作JSON字段中的数据?

编辑:使用json.loads()失败,因为属性名称和值用单引号括起来而不是双引号:

import json
json.loads(x.data)
# JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

我可以使用eval(),但这显然非常危险。

1 个答案:

答案 0 :(得分:1)

事实证明,我编写的用于创建此字段的自定义DRF序列化程序(从POST执行的操作产生到另一个模型的detail_route)使用的是DRF的CharField而不是JSONField 。糟糕!