“last_login”列中的空值违反非空约束

Posted

技术标签:

【中文标题】“last_login”列中的空值违反非空约束【英文标题】:null value in column "last_login" violates not-null constraint 【发布时间】:2016-02-14 11:54:25 【问题描述】:

在摆脱此错误时遇到问题。

我正在尝试使用 Digital Ocean 来部署我的 Django 应用程序。我配置了 Postgres,但是当我尝试在我的应用程序中注册新用户时,我遇到了这个问题。

我试过运行python manage.py makemigrationspython manage.py migrate,它们运行良好。 SQL 迁移在迁移时完成。

【问题讨论】:

您是如何尝试添加上述用户的?通过管理窗格或您的特定方式?你运行的是什么版本的 Django? 试图在 django 模板中注册用户,所以我有表单输入字段,当我提交表单时,views.py 会清理它并保存到数据库。我的版本是 1.8.6 尝试添加from django.utils import timezone,无论你在哪里获取user的数据以保存新的user,在保存过程之前添加<user_object>.last_login = timezone.now() @RichardKennethNiescior 谢谢你这样做 【参考方案1】:

尝试将此添加到您的导入中:

from django.utils import timezone

然后无论您将user 的数据抓取到save 的哪个位置,都在save 过程之前添加新的user

<user_object>.last_login = timezone.now() 

【讨论】:

我们有什么理由不能为last_login 字段使用空值吗?根据 Django 1.8 版本文档,我们应该能够为 Django 的 AbstractUser 模型的 last_login 字段使用空值:docs.djangoproject.com/en/1.8/releases/1.8/… 但是当 last_login 未定义时,我收到“非空约束”错误,这对 Django 1.7 有意义,但对 1.8 没有意义 如果您还没有从与 1.8+ 发行版捆绑在一起的 django.contrib.auth 软件包运行新的迁移,那么这个 hack-job 保证在大多数情况下都能正常工作。我觉得有数据库级别的验证,它被 migration 0005 改变了。 啊,是的,你是对的。我可以通过访问 psql 提示符并运行 \d auth_user 来调试它(在我的例子中,auth_user 是我的 AUTH_USER_MODEL 的 db_table 名称),这表明 last_login 不可为空。之后,运行./manage.py showmigrations --list,我意识到我的迁移应用不正确。 我很高兴这对您有所帮助 :)【参考方案2】:

当我遇到这个问题时,我正在从 django 1.7 升级到 django 1.10。结果是我需要运行python manage.py migrate 来更新数据库表和列。

【讨论】:

【参考方案3】:

这是一种变通方法而非解决方案,但以下是如何创建用户并提供 last_login 的完整示例:

from django.contrib.auth.models import User
from django.utils import timezone

user = User.objects.create_user(
    'username',
    password='password',
    last_login=timezone.now(),
    # Whatever other attributes you want:
    is_superuser=True,
    is_staff=True
)
user.save()

【讨论】:

以上是关于“last_login”列中的空值违反非空约束的主要内容,如果未能解决你的问题,请参考以下文章

IntegrityError:错误:“user_id”列中的空值违反非空约束

错误:关系 xxx 的“id”列中的空值违反非空约束 - Spring Data JPA

在带有 postgres 数据库的 jbpm 6.5.0Final 中出现错误:“id”列中的空值违反了非空约束

Postgresql 在“id”列中抛出空值违反了 GenerationType.IDENTITY 的非空约束

如何忽略 PostgreSQL 窗口函数中的空值?或返回列中的下一个非空值

从 CSV 填充 postgres 表列时出现非空约束错误