“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 makemigrations
和python 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 的非空约束