我正在使用userena并在将以下行添加到models.py
之后zipcode = models.IntegerField(_('zipcode'),
max_length=5)
在我点击注册表单上的提交按钮后出现以下错误:
IntegrityError at /accounts/signup/
NOT NULL constraint failed: accounts_myprofile.zipcode
我的问题是这个错误意味着什么,这与Userena有关吗?
答案 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)。
为了安全起见,您还可以删除
<NUMBER>_auto_<DATE>_<HOUR>.py
最后,如果您未设置Null = True,请确保mode.zipcode = None永远不会在任何地方完成。
答案 3 :(得分:0)
由于已向模型添加了新属性,因此必须首先删除数据库。然后进行manage.py迁移,然后进行manage.py迁移。
答案 4 :(得分:0)
在 models.py 中,您应该将 null=True
添加到邮政编码字段。