从 Django 1.6 (with south) 升级到 1.8 不会修改用户表上的“last_login”
Posted
技术标签:
【中文标题】从 Django 1.6 (with south) 升级到 1.8 不会修改用户表上的“last_login”【英文标题】:Upgrading from Django 1.6 (with south) to 1.8 doesn't modify 'last_login' on the user table 【发布时间】:2015-07-06 23:03:49 【问题描述】:我已从 Django 1.6.5(带有南迁移)升级到 Django 1.8。我已按照此处的说明进行操作: https://docs.djangoproject.com/en/1.8/topics/migrations/#upgrading-from-south
所以,我删除 South,删除我以前的迁移并运行 python manage.py makemigrations
,这会生成一个新的迁移文件。然后我运行python manage.py migrate --fake-initial
来伪造初始迁移。然后我运行python manage.py migrate
。
一切正常,没有错误。
我有一个继承 AbstractBaseUser
的自定义用户模型。在 Django 1.8 中,last_login
字段似乎发生了变化,现在它可以接受 null
值 (https://docs.djangoproject.com/fr/1.8/ref/contrib/auth/#django.contrib.auth.models.User.last_login)。
我遇到的问题是,迁移不会将数据库表中的last_login
字段更改为接受空值。结果,当我尝试保存时,我得到一个IntegrityError
说(1048, "Column 'last_login' cannot be null")
。
我该如何解决这个问题?我需要手动更改数据库中的字段,还是有办法通过迁移来修复它?
编辑
当我运行python manage.py migrate --fake-initial
时,输出是这样的:
运行迁移:
Rendering model states... DONE
Applying contenttypes.0001_initial... FAKED
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... FAKED
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying core.0001_initial... FAKED
Applying admin.0001_initial... FAKED
Applying sessions.0001_initial... FAKED
但是,当我查看数据库时,我仍然看到 user_last_login
为非空。
【问题讨论】:
【参考方案1】:如1.8 release notes中所述:
如果您使用的是继承自
AbstractUser
的自定义用户模型,则需要运行makemigrations
并为包含该模型的应用生成迁移。
【讨论】:
感谢您的回复。我已经这样做了,在上面的编辑中,我添加了包含Applying auth.0005_alter_user_last_login_null... OK
行的输出。如果我是正确的,这是将执行删除非空约束的迁移,但它似乎没有工作。
您需要确保初始迁移与您的数据库架构相匹配。由于您跳过了 Django 1.7,因此您必须编辑为包含您的自定义用户模型的应用程序自动生成的初始迁移,并从 last_login
字段中删除 null=True
属性。然后您可以生成第二个迁移,这将删除 NOT NULL 约束。
如何去掉 NOT NULL 约束?
@diofeher 打开您的0001_initial.py
文件并从模型的last_login
字段中删除null=True
文本。然后再次运行makemigrations
以上是关于从 Django 1.6 (with south) 升级到 1.8 不会修改用户表上的“last_login”的主要内容,如果未能解决你的问题,请参考以下文章
从 South 迁移到 Django 1.7 迁移:可交换依赖项
South - 将 django 应用程序从 sqlite 迁移到 mysql