环境:
示例模型:
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\\\\\\"}\\""'
答案 0 :(得分:8)
原来你不能在同一个项目中使用django-jsonfield和Django的原生JSONField,否则你会遇到问题中所描述的奇怪行为
https://bitbucket.org/schinckel/django-jsonfield/issues/57/cannot-use-in-the-same-project-as-djangos
答案 1 :(得分:1)
对我来说,问题在于该数据库是从备份创建的,并且当列类型应为text
或json
时,列类型设置为jsonb
。
清除所有无效的json,然后使用以下内容更改列类型:
ALTER TABLE t ALTER COLUMN j TYPE jsonb USING j::text::jsonb;