【发布时间】:2017-03-13 21:27:42
【问题描述】:
环境:
- 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(),但这显然非常危险。
【问题讨论】:
-
你肯定会使用
json.loads()而不是eval。 -
您可以使用
json.loads()将该字符串转换为您想要的字典,但这很奇怪。我有一个使用JSONField的应用程序,但这不会发生。此外,如果这是预期的行为,则使用JSONField或TextField之间不会有太大区别。您确定您正在检索的对象与您使用x.data = {'some key': 'some value'}保存的对象完全相同吗? -
@lucasnadalutti 在我运行此示例之前,该表是空的,因此可以保证它是正确的对象,因为它是 only 对象。另外,请参阅最新的编辑,了解为什么
json.loads()不起作用。 -
正如卢卡斯所说,这不应该发生。你确定你最初传递的数据真的是一个字典,而不是一个字符串?
-
@DanielRoseman 我认为你是对的。我认为 Django-rest-framework 把我搞砸了。让我试试……
标签: python django postgresql python-3.x