2017-01-23 37 views
0

在我models.py,我有以下代碼:追加到一個Django JsonField的項目 - 獲取一個TypeError

from __future__ import unicode_literals 
from django.db import models 
from django.contrib.postgres.fields import JSONField 
import json 

class Table(models.Model): 
    name = models.CharField(max_length=255) 
    structure = JSONField(default=json.dumps('{}')) 

    def __unicode__(self): 
     return self.name 

class Column(models.Model): 
    table = models.ForeignKey(Table, related_name='columns') 
    name = models.CharField(max_length=255) 
    required = models.BooleanField(default=True) 

    def __unicode__(self): 
     return self.name + ' FROM TABLE ' + self.table.name 

    def save(self, *args, **kwargs): 
     if not self.pk: 
      self.table.structure[self.name] = { 
       'required' : self.required, 
      } 

正如你可以從代碼,當一列被保存,如果看見該列的必填字段將被添加到表格的結構中。然而,當我嘗試保存從管理面板中的專欄中,我得到以下錯誤:

TypeError at /admin/myapp/column/add/ 
'unicode' object does not support item assignment 

我認爲這個問題是我的結構字段的默認值。我也試過以下內容:

structure = JSONField(default={}) 
structure = JSONField(default='{}') 
structure = JSONField(default=dict) 

每一次,我都有同樣的錯誤。任何幫助?謝謝。

回答

3

根據文檔,如果您希望默認值爲字典,則正確的定義爲JSONField(default=dict)。請注意,您可能需要清理現有數據庫 - 以unicode字符串存儲的內容(使用原始定義)仍將作爲unicode字符串反序列化。

不,這是very cleary documented

If you give the field a default, ensure it’s a callable such as dict (for an empty default) or a callable that returns a dict (such as a function). Incorrectly using default={} creates a mutable default that is shared between all instances of JSONField.

這樣您就可以通過先讀文檔保存你一些麻煩。

+0

我實際上已經閱讀過文檔,但之前已經有一個將其設置爲{}的遷移。我沒有真正的數據庫清理部分。不過謝謝。 –

-1

編輯 只是因爲它是空的,所以不要使用默認值。這已經是默認了。您也可以使用None作爲默認值(請參閱this後)

+0

來自doc:「用於存儲JSON編碼數據的字段。在Python中,數據以Python本機格式表示:字典,列表,字符串,數字,布爾值和無」 - 所以這不是問題。 –

+0

@brunodesthuilliers你是對的 - 我被誤認爲是一個不同的json字段包。 – denvaar

相關問題