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