ste*_*han 30 django django-models
我正在使用userena并在我的models.py中添加以下行
zipcode = models.IntegerField(_('zipcode'),
max_length=5)
Run Code Online (Sandbox Code Playgroud)
我点击注册表单上的提交按钮后出现以下错误:
IntegrityError at /accounts/signup/
NOT NULL constraint failed: accounts_myprofile.zipcode
Run Code Online (Sandbox Code Playgroud)
我的问题是这个错误是什么意思,这与Userena有关吗?
col*_*ind 55
您必须创建一个迁移,您将在其中为新字段指定默认值,因为您不希望它为null.如果不需要null,只需添加null=True并创建并运行迁移.
小智 10
在NOT NULL constraint failed当一些尝试集合中出现None的zipcode财产,而它并没有被明确允许。
它通常发生在:
Null=False默认情况下,您的字段具有,因此在None创建对象并将其保存在数据库中时,数据库中的值不能(即未定义)(这发生在objects_set.create()调用或设置.zipcode属性并执行.save()调用之后)。
例如,如果在您的代码中某处赋值导致:
model.zipcode = None
Run Code Online (Sandbox Code Playgroud)
引发此错误。
在创建或更新数据库时,Django 被约束寻找一个默认值来填充该字段,因为Null=False默认情况下。它没有找到任何,因为您还没有定义任何。那么这个错误不仅会在代码执行期间发生,而且在创建数据库时也会发生?
请注意,如果您定义了相同的错误default=None,或者如果您的默认值类型不正确,例如default='00000'而不是00000您的字段(也许可以在字符和整数之间进行自动转换,但我建议不要依赖它) .此外,显式优于隐式)。如果默认值违反 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)
Run Code Online (Sandbox Code Playgroud)
然后进行迁移 ( python3 manage.py makemigration <app_name>),然后迁移 ( python3 manage.py migrate)。
为了安全起见,您还可以删除 中最后一个失败的迁移文件<app_name>/migrations/,通常以这种模式命名:
<NUMBER>_auto_<DATE>_<HOUR>.py
Run Code Online (Sandbox Code Playgroud)
最后,如果您没有设置Null=True,请确保mode.zipcode = None永远不会在任何地方进行。
| 归档时间: |
|
| 查看次数: |
85609 次 |
| 最近记录: |