繁体   English   中英

Django 1.9 JSONfield存储字典改为返回unicode

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM