【发布时间】:2017-08-03 22:18:57
【问题描述】:
环境:
- Django 1.10.6
- psycopg2 2.7.1
- 通过 Homebrew 在 macOS Sierra 上安装 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\\\\\\"}\\""'
【问题讨论】:
-
这不应该发生。你能展示你的完整模型吗?您是否有任何验证器、自定义保存方法或附加到保存事件的任何信号?
-
我开始从项目中安装的其他应用程序向后工作,发现罪魁祸首是这个应用程序github.com/jjkester/django-auditlog。当我从 MIDDLEWARE 和 INSTALLED_APPS 中删除它时,一切都按预期工作。进一步看,该项目需要 django-jsonfield 并且两者之间一定存在一些不兼容
-
事实上它已经是该项目中的一个未解决问题github.com/jjkester/django-auditlog/issues/71
标签: python json django postgresql