[英]Django 1.9 JSONfield stored dictionary returns unicode instead
我们刚刚升级到Django 1.9并将其移动到内置的JSONfield,我们用它来存储字典。 但是,当我尝试从中读取数据时,它会返回字典的unicode。
我的JSONfield定义为:
class SmsInfo(models.Model):
[...]
json = JSONField(default=dict)
数据通过以下方式写入:
params = dict(request.POST)
SmsInfo.objects.create([...], json=params, [...])
稍后会以这种方式阅读:
incoming_smsses = SmsInfo.objects.select_related('game').defer('game__serialized').filter([...])
在这一点上:
print incoming_smsses[0].json.__class__
回报
<type 'unicode'>
而不是我期待的字典,我的代码崩溃,因为它无法查找任何键。
我已经坚持了很多,我无法弄清楚为什么会出错。 我现在使用literal_eval作为解决方法,它将unicode变回dict。 这暂时有效,但我宁愿在源头解决这个问题!
为什么我的字典在这里转为unicode?
我刚刚从第三方JSONField升级到本机postgres JSONField,并通过psql发现列类型仍然是text
。
所以在psql上,确认您的列类型:
\d+ table_name
如果列仍然是文本,则更改列:
ALTER TABLE table_name ALTER COLUMN column_name TYPE jsonb USING column_name::jsonb;
正如erickw在评论中所建议的那样,这已被提交为一个错误: https ://code.djangoproject.com/ticket/27675
如果您之前碰巧使用过django-jsonfield
,则它们之间存在冲突,因此如上面的错误所示,解决方案是完全删除并重新创建使用jsonfield的应用程序的迁移文件 。
在这种情况下,显然你也想卸载django-jsonfield
。
我正在使用Django 1.11和postgres 11.4。
将python dicts列表传递给JSONField对我有用:
data_python = []
for i in range(3):
entry = {
'field1': value1,
'field2': 999,
'field3': 'aaaaaaaaaa',
'field4': 'never'
}
data_python.append(entry)
MyModel.objects.create(data=data_python, name='DbEntry1')
我的猜测是,对于dicts,这应该也可以
我的模型是:
class MetersWithNoReadings(models.Model):
created_datetime = models.DateTimeField(auto_now_add=True)
updated_datetime = models.DateTimeField(auto_now=True)
name = models.CharField(max_length=25)
data = JSONField()
正如@stelios所指出的,这是django-jsonfield
一个错误,它与本机版本不兼容。
或者:
django-jsonfield
(如果不再需要它作为项目依赖项,可以使用pipdeptree
进行检查),或者 django-jsonfield >= 1.3.0
因为问题现已关闭并且修复程序已合并。 这里似乎与数据库存储有关。 这个JSONField仍然可以作为正确JSON格式的验证器。
但是,您可以通过此返回的unicode字符串来破解并加载dict。
尝试如下:
import json
data = json.loads(incoming_smsses[0].json)
然后你可以作为词典IMO访问它。
您需要使用本机postgres JSONField
from django.contrib.postgres import fields
class Some_class(models.Model):
json = fields.JSONField()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.