将项目附加到 Django JsonField - 获取 TypeError
Appending an item to a Django JsonField - Getting a TypeError
在我的models.py中,我有以下代码:
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,
}
从代码中可以看出,当保存一个Column时,如果该列的必填字段被添加到Table的结构中。但是,当我尝试从管理面板保存列时,出现以下错误:
TypeError at /admin/myapp/column/add/
'unicode' object does not support item assignment
我认为问题出在我的结构字段的默认值上。我还尝试了以下方法:
structure = JSONField(default={})
structure = JSONField(default='{}')
structure = JSONField(default=dict)
每次,我都得到同样的错误。有什么帮助吗?谢谢
编辑
只需保留默认值,因为它是空的。那已经是默认值了。您也可以使用 None
作为默认值(参见 post)
根据文档,如果您希望默认为字典,正确的定义是 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.
所以你可以通过先阅读文档来避免一些麻烦。
在我的models.py中,我有以下代码:
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,
}
从代码中可以看出,当保存一个Column时,如果该列的必填字段被添加到Table的结构中。但是,当我尝试从管理面板保存列时,出现以下错误:
TypeError at /admin/myapp/column/add/
'unicode' object does not support item assignment
我认为问题出在我的结构字段的默认值上。我还尝试了以下方法:
structure = JSONField(default={})
structure = JSONField(default='{}')
structure = JSONField(default=dict)
每次,我都得到同样的错误。有什么帮助吗?谢谢
编辑
只需保留默认值,因为它是空的。那已经是默认值了。您也可以使用 None
作为默认值(参见
根据文档,如果您希望默认为字典,正确的定义是 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.
所以你可以通过先阅读文档来避免一些麻烦。