python - 为什么 Django 将 postgres JSONField 值作为字符串返回?

标签 python json django postgresql

环境:

  • Django 1.10.6
  • psycopg2 2.7.1
  • 在 macOS Sierra 上通过 Homebrew 安装 PostgreSQL 9.6.2
  • 通过 Homebrew 安装 Python 3.6.0

示例模型:

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 = {'key1': 'value1'}
x.save()

并且查询按预期工作:

Foo.objects.filter(data__key1='value1').count()
# 1

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

from myapp.models import Foo
x = Foo.objects.get(id=1)
x.data
# '{"key1": "value1"}'
type(x.data)
# str

我希望在这里得到一个口述。当试图保存对象时,问题递归地变得更糟

x.save()
x = Foo.objects.get(id=1)
x.data
# '"{\\"key1\\": \\"value1\\"}"'
x.save()
x = Foo.objects.get(id=1)
x.data
# '"\\"{\\\\\\"key1\\\\\\": \\\\\\"value1\\\\\\"}\\""'

最佳答案

原来你不能在同一个项目中使用 django-jsonfield 和 Django 的原生 JSONField 或者你会遇到问题中描述的奇怪行为

https://bitbucket.org/schinckel/django-jsonfield/issues/57/cannot-use-in-the-same-project-as-djangos

关于python - 为什么 Django 将 postgres JSONField 值作为字符串返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42771437/

相关文章:

python - 在 python 中编写这个条件是否有更清晰、更短的方法?

javascript - send() 是匿名函数吗?

javascript - 从 Django 的 javascript 函数中获取 map 坐标的最快方法

python - 选择相关 - 从外键中选择一个对象

javascript - 与 .innerHTML 一起传递值

python - 将参数从 shell 脚本传递到 Python 脚本,而无需在命令行上指定参数

python - 使用 Python 将 Google Sheet 下载为 CSV,生成只有一行的 CSV

python - 为什么 yield 表达式不能作为函数参数?

javascript - 样式化 json 列表

python - { "error": "inputs is a plain value/list, but expecting an object as multiple input tensors required as per tensorinfo_map" }