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

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并创建并运行迁移.

  • 注意:您可能必须删除已存在的迁移文件才能再次运行makemigrations并进行迁移. (5认同)
  • 发生一次此错误后,迁移不会运行。 (2认同)

小智 10

Coldmind回答是正确的,但缺乏细节。

NOT NULL constraint failed当一些尝试集合中出现Nonezipcode财产,而它并没有被明确允许。

它通常发生在:

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

    例如,如果在您的代码中某处赋值导致:

    model.zipcode = None
    
    Run Code Online (Sandbox Code Playgroud)

    引发此错误。

  2. 在创建或更新数据库时,Django 被约束寻找一个默认值来填充该字段,因为Null=False默认情况下。它没有找到任何,因为您还没有定义任何。那么这个错误不仅会在代码执行期间发生,而且在创建数据库时也会发生?

  3. 请注意,如果您定义了相同的错误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永远不会在任何地方进行。


Mah*_*dav 8

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