从Django 1.6(南方)升级到1.8不会修改用户表上的"last_login"

Lon*_*Dev 25 python mysql django django-south django-1.8

我已经从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
Run Code Online (Sandbox Code Playgroud)

但是,当我查看数据库时,我仍然看到user_last_login非null.

Tim*_*ham 22

1.8发行说明中所述:

如果您使用的是继承自的自定义用户模型,则AbstractUser需要为makemigrations包含该模型的应用程序运行并生成迁移.

  • 您需要确保初始迁移与数据库架构匹配.由于您跳过了Django 1.7,因此您必须编辑包含自定义用户模型的应用程序的自动生成的初始迁移,并从`last_login`字段中删除`null = True`属性.然后,您可以生成第二个迁移,它将删除NOT NULL约束. (15认同)
  • @diofeher打开你的`0001_initial.py`文件并从模型的`last_login`字段中删除`null = True`文本.然后再次运行`makemigrations` (2认同)