簡體   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