为什么Django中的空char字段读为None而不是空字符串?

时间:2011-11-21 19:43:57

标签: python django django-models

我有一个模型,例如:

class Item(models.Model):
    text = model.CharField(max_length=50)
    extra_text = model.CharField(max_length=50, blank=True)

假设我有一个extra_text为空的对象实例,因此在数据库中它存储为空字符串''

我读了那个对象,例如:

myitem = Item.objects.get(id=1)

现在我检查myitem.extra_text的值是什么,它不是'',而是None(这里是IPython shell):

In [36]: myitem.extra_text == ''
Out[36]: False

In [37]: myitem.extra_text == None
Out[37]: True

In [38]: myitem.extra_text is None
Out[38]: True

此时不应该是''吗?数据库中为'',因为不允许NULL

我的问题是这样的对象无法保存未修改回数据库,因为如果我尝试我得到:

In [39]: myitem.save()
<skipping Traceback>
IntegrityError: null value in column "extra_text" violates not-null constraint

我觉得很奇怪,我刚刚从数据库中读取并且没有以任何方式修改的对象实例无法保存回数据库。我做错了什么吗?解决这个问题的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

我只能想到会出现这种情况的一种情况:

您的现有模型包含数据库中的现有条目。然后添加一个新的CharField但忽略为现有项目提供默认值。查询现有项时,该CharField将没有值,但也不允许为NULL,并且您将获得完整性错误。

如果这听起来很熟悉,你应该能够通过在添加字段时指定默认值(即使它只是'')来修复它。

答案 1 :(得分:0)

我发现了问题:我在这个模型上使用django-modeltranslation,在这个字段上,我认为它只影响模板,我认为外部模板item.extra_text仍然与extra_text有关数据库中的列。但似乎即使在shell中它也使用了本地化(进入默认语言)extra_text_en列,并且那个列是NULL。

我现在已将所有行中的extra_text字段更新为数据库中的'',并将其设为NOT NULL DEFAULT '',所以现在当我将其读入Python时,u'' 。但问题是这样的 django-modeltranslation仍然希望在数据库中将其保存为NULL,从而产生IntegrityError: null value in column "title_extra_en" violates not-null constraint

所以我仍然不知道如何使其与django-modeltranslation一起使用。

相关问题