django 添加到www.example.com后出现“NOT NULL约束失败”models.py

cclgggtu  于 2022-11-26  发布在  Go
关注(0)|答案(5)|浏览(130)

我正在使用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有关吗?

bjp0bcyl

bjp0bcyl1#

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

yzxexxkh

yzxexxkh2#

coldmindanswer是正确的,但缺少细节。

NOT NULL constraint failed发生在尝试将None设定为zipcode属性,但尚未明确允许时。

通常发生在以下情况:
1.默认情况下,您的字段为Null=False,因此在数据库中创建并保存对象时(在objects_set.create()调用或设置.zipcode属性并执行.save()调用后发生),数据库中的值不能为None(即未定义)。
例如,如果在程式码中的某个位置,指派会产生:

model.zipcode = None

会引发这个错误。
1.当创建或更新数据库时,Django被 * 约束 * 寻找一个默认值来填充字段,因为默认值为Null=False。它没有找到任何值,因为您没有定义任何值。所以这个错误不仅会发生在代码执行过程中,也会发生在创建数据库时?
1.请注意,如果定义了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 <app_name>),然后迁移(python3 manage.py migrate)。
为安全起见你也可以删除<app_name>/migrations/中最后一次失败的迁移文件,这里通常以这种模式命名:

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

最后,如果您没有设置Null=True,请确保在任何地方都不会设置mode.zipcode = None

zynd9foi

zynd9foi3#

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

toiithl6

toiithl64#

在Django中Null=True表示空值被接受。但是一些字段有Django的Blank=True不满足置空字段的要求。

  • 日期时间字段
  • 外键

使用这两个字段,如果您想将其留空,我建议添加 NULL=TRUE

eqzww0vc

eqzww0vc5#

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

相关问题