' NOT NULL约束失败'添加到models.py后

时间:2014-09-21 21:59:10

标签: django django-models

我正在使用userena并在将以下行添加到models.py

之后
zipcode = models.IntegerField(_('zipcode'),
                                   max_length=5)

在我点击注册表单上的提交按钮后出现以下错误:

IntegrityError at /accounts/signup/
NOT NULL constraint failed: accounts_myprofile.zipcode

我的问题是这个错误意味着什么,这与Userena有关吗?

5 个答案:

答案 0 :(得分:50)

您必须创建一个迁移,您将在其中为新字段指定默认值,因为您不希望它为null。如果不需要null,只需添加null=True并创建并运行迁移。

答案 1 :(得分:8)

如果zipcode字段不是必填字段,则添加null = True且空白= True,然后运行makemigrations和migrate命令以成功反映数据库中的更改。

答案 2 :(得分:6)

@coldmind答案是正确的,但缺少详细信息。

当某些人试图将“邮政编码”属性设置为“无”时,发生了“ NOT NULL约束失败”,而未明确允许。

通常在以下情况下发生:

1)默认情况下,您的字段的Null = False,因此在创建对象并将其保存在数据库中时,数据库中的值不能为None(即未定义)(在objects_set.create()调用或设置.zipcode属性并进行.save()调用)。

例如,如果代码在某处分配,则会导致:

model.zipcode = None

出现此错误

2)创建或更新数据库时,Django受约束的限制,以查找默认值来填充该字段,因为默认情况下Null = False。它找不到任何内容,因为您尚未定义任何内容。那么,这个错误不仅会在代码执行期间发生,而且还会在创建数据库时发生?

3)请注意,如果您定义default = None,或者如果您的默认值类型不正确,例如您的字段的default ='00000'而不是00000,则将返回相同的错误(也许可以自动转换)在char和integer之间,但是我建议不要依赖它。此外,显式要好于隐式)。如果默认值违反了max_length属性,例如123456

因此,您必须通过以下方式之一定义字段:

models.IntegerField(_('zipcode'), max_length=5, Null=True,
   blank=True)

models.IntegerField(_('zipcode'), max_length=5, Null=False,
   blank=True, default=00000)

models.IntegerField(_('zipcode'), max_length=5, blank=True,
   default=00000)

然后进行迁移(python3 manage.py makemigration),然后进行迁移(python3 manage.py migration)。

为了安全起见,您还可以删除 / migrations /中最后一个失败的迁移文件,通常以该模式命名:

<NUMBER>_auto_<DATE>_<HOUR>.py

最后,如果您未设置Null = True,请确保mode.zipcode = None永远不会在任何地方完成。

答案 3 :(得分:0)

由于已向模型添加了新属性,因此必须首先删除数据库。然后进行manage.py迁移,然后进行manage.py迁移。

答案 4 :(得分:0)

在 models.py 中,您应该将 null=True 添加到邮政编码字段。