0

在我的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)

每次,我都得到同样的错误。有什么帮助吗?谢谢。

4

2 回答 2

5

根据文档,如果您希望默认为 dict ,则正确的定义是JSONField(default=dict). 请注意,您可能需要清理现有数据库 - 已存储为 unicode 字符串(使用您的原始定义)的内容仍将被反序列化为 unicode 字符串。

并不是说这是非常清楚的记录

如果您为该字段提供默认值,请确保它是可调用的,例如 dict(对于空默认值)或返回 dict 的可调用(例如函数)。错误地使用 default={} 会创建一个在所有 JSONField 实例之间共享的可变默认值。

因此,您可以通过先阅读文档来节省一些麻烦。

于 2017-01-23T08:40:52.557 回答
-1

编辑 只需保留默认值,因为它是空的。这已经是默认设置了。您也可以None用作默认值(请参阅帖子)

于 2017-01-23T06:42:31.513 回答