2015-04-28 11 views
24

Zaktualizowałem z Django 1.6.5 (z migracjami południowymi) do Django 1.8. Śledzę z instrukcjami tutaj: https://docs.djangoproject.com/en/1.8/topics/migrations/#upgrading-from-southAktualizacja z Django 1.6 (z południem) do 1.8 nie modyfikuje "last_login" w tabeli użytkownika

Więc usunąć South, usunąć moje wcześniejsze migracje i uruchomić python manage.py makemigrations który tworzy nowy plik migracji. Następnie uruchamiam python manage.py migrate --fake-initial, aby sfałszować początkową migrację. Następnie uruchamiam python manage.py migrate.

Wszystko działa bez żadnych błędów.

Mam niestandardowy model użytkownika, który dziedziczy AbstractBaseUser. W Django 1.8 wydaje się, że jest zmiana w polu last_login, gdzie jest teraz w stanie zaakceptować wartość null (https://docs.djangoproject.com/fr/1.8/ref/contrib/auth/#django.contrib.auth.models.User.last_login).

Problem polega na tym, że migracja nie zmienia pola last_login w tabeli bazy danych, aby zaakceptować wartości puste. W rezultacie, gdy próbuję i zapisuję, otrzymuję IntegrityError z informacją: (1048, "Column 'last_login' cannot be null").

Jak mogę rozwiązać ten problem? Czy muszę ręcznie zmienić pole w bazie danych, czy jest jakiś sposób, aby naprawić to za pomocą migracji?

Edit Kiedy biegnę python manage.py migrate --fake-initial wyjście to: przebiegu migracje:

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 

Jednak kiedy patrzę w bazie wciąż widzę user_last_login jako nie-NULL.

Odpowiedz

21

Jak zaznaczono w 1.8 release notes:

Jeśli używasz niestandardowego modelu użytkownika, który dziedziczy AbstractUser, musisz uruchomić makemigrations i wygenerować migracji swojej aplikacji zawierającej tego modelu.

+0

Dziękuję za odpowiedź. Zrobiłem to już, w mojej edycji powyżej dodałem wyjście, które zawiera wiersz 'Applying auth.0005_alter_user_last_login_null ... OK'. Jeśli mam rację, jest to migracja, która spowoduje usunięcie ograniczenia nie zerowego, ale nie wydaje się działać. –

+15

Musisz upewnić się, że początkowe migracje są zgodne ze schematem bazy danych. Ponieważ pominąłeś Django 1.7, musisz edytować automatycznie wygenerowaną migrację początkową dla aplikacji, która zawiera niestandardowy model użytkownika i usunąć atrybut 'null = True' z pola' last_login'. Następnie możesz wygenerować drugą migrację, która usunie ograniczenie NOT NULL. –

+0

Jak usunąć ograniczenie NOT NULL? – diofeher

Powiązane problemy