Wiem, że od Django 1.7 nie muszę używać South ani żadnego innego systemu migracji, więc używam tylko prostego polecenia python manage.py makemigrations
Jednak wszystko co otrzymuję to ten błąd:
You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).
Oto models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
Jakie są opcje?
Odpowiedzi:
Musisz podać wartość domyślną:
źródło
default = website
nie spełnia swojejnew_field
nawebsite
.Jeśli jesteś na wczesnym etapie rozwoju i nie interesują Cię aktualne dane bazy danych, możesz je po prostu usunąć, a następnie przeprowadzić migrację. Ale najpierw musisz wyczyścić katalog migracji i usunąć jego wiersze z tabeli (django_migrations)
źródło
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
__init__.py
pliku z migracji lub przywrócisz go później, w przeciwnym razie makemigrations nie będzie działać stackoverflow.com/a/46362750/1649917python manage.py sqlmigrate name_of_your_app nb_of_the_migration
jest również wymaganeJedną z opcji jest zadeklarowanie domyślnej wartości dla „nowego_pola”:
inną opcją jest zadeklarowanie „new_field” jako pola dopuszczającego wartość null:
Jeśli zdecydujesz się zaakceptować „nowe_pole” jako pole dopuszczające wartość null, możesz zaakceptować „brak danych wejściowych” jako poprawne dane wejściowe dla „nowego_pola”. Następnie musisz dodać również
blank=True
oświadczenie:Nawet z
null=True
i / lubblank=True
w razie potrzeby możesz dodać wartość domyślną:źródło
Jeśli jesteś na wczesnym etapie cyklu rozwojowego, możesz spróbować tego -
Usuń / skomentuj ten model i wszystkie jego zastosowania. Zastosuj migracje. To spowodowałoby usunięcie tego modelu, a następnie ponowne dodanie modelu, uruchomienie migracji i uzyskanie czystego modelu z dodanym nowym polem.
źródło
W przypadku, gdy ktoś ustawia a
ForeignKey
, możesz po prostu zezwolić na pola dopuszczające wartość null bez ustawiania wartości domyślnej:Jeśli masz już dane przechowywane w bazie danych, możesz również ustawić wartość domyślną:
źródło
Jeśli „witryna” może być pusta, to
new_field
również powinna być pusta.Teraz, jeśli chcesz dodać logikę przy zapisywaniu, gdzie jeśli
new_field
jest puste, aby pobrać wartość z „strony internetowej”, wszystko, co musisz zrobić, to nadpisać funkcję zapisywania wModel
następujący sposób:źródło
Nie możesz dodać odwołania do tabeli, która zawiera już dane.
Zmiana:
do:
robić:
zmień ponownie:
ponownie wykonaj migrację:
źródło
W new_file dodaj właściwość logiczną null.
po uruchomieniu
./manage.py syncdb
dla odświeżyć DB. i wreszcie biegniesz./manage.py makemigrations
i./manage.py migrate
źródło
Możesz użyć metody z Django Doc z tej strony https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
Utwórz domyślne i użyj go
źródło
Czy masz już wpisy bazy danych w tabeli
UserProfile
? Jeśli tak, po dodaniu nowych kolumn baza danych nie wie, na co ją ustawić, ponieważ nie możeNULL
. Dlatego zapyta Cię, do czego chcesz ustawić te pola w kolumnienew_fields
. Musiałem usunąć wszystkie wiersze z tej tabeli, aby rozwiązać problem.(Wiem, że odpowiedź na to pytanie udzielono jakiś czas temu, ale właśnie napotkałem ten problem i to było moje rozwiązanie. Mam nadzieję, że pomoże to każdemu nowemu, który to zobaczy)
źródło
Szczerze mówiąc, najlepszym sposobem obejścia tego problemu było po prostu utworzenie kolejnego modelu ze wszystkimi wymaganymi polami i nazwanymi nieco innymi. Uruchom migracje. Usuń nieużywany model i ponownie uruchom migracje. Voila.
źródło
Jeśli możesz skrócić tabelę danego modelu, możesz określić jednorazową domyślną wartość
None
w monicie. Migracja będzie zbędna,default=None
podczas gdy Twój kod nie ma wartości domyślnych. Można go zastosować dobrze, ponieważ w tabeli nie ma już danych, które wymagałyby ustawienia domyślnego.źródło
Byłem na wczesnym etapie mojego cyklu rozwojowego, więc może to nie działać dla wszystkich (ale nie rozumiem, dlaczego by nie działało).
Dodałem
blank=True, null=True
do kolumn, w których otrzymywałem błąd. Następnie uruchomiłempython manage.py makemigrations
polecenie.Natychmiast po uruchomieniu tego polecenia (i przed uruchomieniem
python manage.py migrate
) usunąłemblank=True, null=True
ze wszystkich kolumn. Potem uciekłempython manage.py makemigrations
znowu . Dostałem możliwość samodzielnej zmiany kolumn, które wybrałem.Potem pobiegłem
python manage.py migrate
i wszystko działało dobrze!źródło
Django tak naprawdę mówi:
Jeśli jesteś pewien, że żadna z wartości w
userprofile
tabeli nie ma wartości NULL - spadła swobodnie i zignoruj ostrzeżenie.Najlepszą praktyką w takich przypadkach byłoby utworzenie migracji RunPython do obsługi pustych wartości, zgodnie z opcją 2
W migracji RunPython musisz znaleźć wszystkie
UserProfile
instancje z pustąnew_field
wartością i umieścić tam poprawną wartość (lub wartość domyślną, ponieważ Django poprosi Cię o ustawienie w modelu). Otrzymasz coś takiego:Baw się dobrze!
źródło
W models.py
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")
Musisz domyślnie dodać niektóre wartości.
źródło
Jeśli SSH daje 2 opcje, wybierz numer 1 i wpisz „Brak”. Tylko to ... na razie.
źródło