我正在使用userena,在将下面的行添加到我的www.example.com之后models.py
zipcode = models.IntegerField(_('zipcode'),
max_length=5)
我点击注册表单上的提交按钮后收到以下错误:
IntegrityError at /accounts/signup/
NOT NULL constraint failed: accounts_myprofile.zipcode
我的问题是这个错误意味着什么,这与Userena有关吗?
5条答案
按热度按时间bjp0bcyl1#
您必须创建一个迁移,在其中为新字段指定默认值,因为您不希望它为空。如果不需要空,只需添加
null=True
,然后创建并运行迁移。yzxexxkh2#
coldmind的answer是正确的,但缺少细节。
NOT NULL constraint failed
发生在尝试将None
设定为zipcode
属性,但尚未明确允许时。通常发生在以下情况:
1.默认情况下,您的字段为
Null=False
,因此在数据库中创建并保存对象时(在objects_set.create()
调用或设置.zipcode
属性并执行.save()
调用后发生),数据库中的值不能为None
(即未定义)。例如,如果在程式码中的某个位置,指派会产生:
会引发这个错误。
1.当创建或更新数据库时,Django被 * 约束 * 寻找一个默认值来填充字段,因为默认值为
Null=False
。它没有找到任何值,因为您没有定义任何值。所以这个错误不仅会发生在代码执行过程中,也会发生在创建数据库时?1.请注意,如果定义了
default=None
,或者默认值的类型不正确(例如,将default='00000'
而不是00000
用于字段),则会返回相同的错误(也许可以在char和integer之间自动转换,但我建议不要依赖它。此外,显式优于隐式)。如果默认值违反了max_length属性(例如123456),则很可能也会引发错误因此,您必须使用下列其中一项来定义字段:
然后进行迁移(
python3 manage.py makemigration <app_name>
),然后迁移(python3 manage.py migrate
)。为安全起见你也可以删除
<app_name>/migrations/
中最后一次失败的迁移文件,这里通常以这种模式命名:最后,如果您没有设置
Null=True
,请确保在任何地方都不会设置mode.zipcode = None
。zynd9foi3#
如果
zipcode
字段不是必需字段,则添加null=True
和blank=True
,然后运行makemigrations和migrate命令以成功反映数据库中的更改。toiithl64#
在Django中
Null=True
表示空值被接受。但是一些字段有Django的Blank=True
不满足置空字段的要求。使用这两个字段,如果您想将其留空,我建议添加 NULL=TRUE
eqzww0vc5#
由于您向模型添加了新属性,因此必须首先删除数据库。然后进行manage.py迁移,最后进行manage.py迁移。