Обновление с Django 1.6 (с югом) до 1.8 не изменяет last_login в пользовательской таблице

Я обновился с Django 1.6.5 (с южными миграциями) до Django 1.8. Я выполнил инструкции здесь: https://docs.djangoproject.com/en/1.8/topics/migrations/#upgrading-from-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 как ненулевое значение.


person LondonAppDev    schedule 28.04.2015    source источник


Ответы (1)


Как указано в примечаниях к выпуску 1.8 < / а>:

Если вы используете пользовательскую модель пользователя, унаследованную от AbstractUser, вам нужно будет запустить makemigrations и сгенерировать миграцию для вашего приложения, содержащего эту модель.

person Tim Graham    schedule 28.04.2015
comment
Спасибо за ваш ответ. Я уже сделал это, в моем редактировании выше я добавил результат, содержащий строку Applying auth.0005_alter_user_last_login_null... OK. Если я прав, это миграция, которая выполнит удаление ограничения not null, однако, похоже, это не сработало. - person LondonAppDev; 28.04.2015
comment
Вам необходимо убедиться, что начальные миграции соответствуют вашей схеме базы данных. Поскольку вы пропустили Django 1.7, вам придется отредактировать автоматически созданную начальную миграцию для приложения, которое содержит вашу пользовательскую модель, и удалить атрибут null=True из поля last_login. Затем вы можете сгенерировать вторую миграцию, которая удалит ограничение NOT NULL. - person Tim Graham; 28.04.2015
comment
Как удалить ограничение NOT NULL? - person diofeher; 17.06.2015
comment
@diofeher Откройте файл 0001_initial.py и удалите текст null=True из поля last_login на вашей модели. Затем снова запустите makemigrations - person Patrick; 23.01.2016