【问题标题】:Why is data returned from django.contrib.postgres.fields.JSONField a string?为什么从 django.contrib.postgres.fields.JSONField 返回的数据是一个字符串?
【发布时间】: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 的应用程序,但这不会发生。此外,如果这是预期的行为,则使用 JSONFieldTextField 之间不会有太大区别。您确定您正在检索的对象与您使用x.data = {'some key': 'some value'} 保存的对象完全相同吗?
  • @lucasnadalutti 在我运行此示例之前,该表是空的,因此可以保证它是正确的对象,因为它是 only 对象。另外,请参阅最新的编辑,了解为什么 json.loads() 不起作用。
  • 正如卢卡斯所说,这不应该发生。你确定你最初传递的数据真的是一个字典,而不是一个字符串?
  • @DanielRoseman 我认为你是对的。我认为 Django-rest-framework 把我搞砸了。让我试试……

标签: python django postgresql python-3.x


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多