2015-07-11 6 views
12

I zdefiniowano poniżej modelu i corazBłąd: "Próbujesz dodać pole non-zerowalne"

błąd: You are trying to add a non-nullable field 'user' to videodata without a default; we can't do that

models.py

class User(Model): 
    userID = models.IntegerField() 
    userName = models.CharField(max_length=40) 
    email = models.EmailField() 
    class Meta: 
     ordering = ['userName'] 
     verbose_name = 'User MetaData' 
     verbose_name_plural = 'Users MetaData' 
    def __unicode__(self): 
     return str(self.userName) 

class VideoData(Model): 
    video = models.CharField(max_length=40) 
    time = models.IntegerField() 
    user = models.ForeignKey(User, related_name='User') 
    class Meta: 
     verbose_name = 'User_Video MetaData' 

Gdzie robię źle? ???

+0

Możliwy duplikat http://stackoverflow.com/questions/26185687/you-are-trying-to-add-a-non-nullable-field-new-field- to-userprofile-without-a – trpt4him

Odpowiedz

15

Zgodnie z błędem, twoje pole użytkownika w VideoData nie pozwala na wartości null, więc musisz podać mu domyślnego użytkownika lub zezwolić na wartości null. Najłatwiej jest zezwolić na wartości null.

user = models.ForeignKey(User, related_name='User', null=True) 

lub mieć domyślnego użytkownika

user = models.ForeignKey(User, related_name='User', default=<have your default user id here>) 
+1

ten sam problem, ale nie rozwiązany przez to rozwiązanie. czemu? –

8

mam napotkasz ten sam problem z moim OneToOneField. I, co zrobiłem było usunąć wszystkie pliki z migracją (które są w katalogu z migrations pod app) i pobiegł:

python manage.py makemigrations 

i

python manage.py migrate 

nie wiem dlaczego, ale zadziałało w moim przypadku. Nie zaszkodzi ci spróbować tego, co napisałem powyżej.

Powodzenia!

2

Oto co zrobiłem, aby rozwiązać ten sam problem

  1. komentarz kluczem odniesienia zagraniczny wizyjne i uruchomić makemigrations i migrować
  2. Dodaj model w admins.py i wprowadź nowy wpis w tabeli
  3. Teraz odkomentuj odwołanie do klucza obcego i podaj wartość domyślną = 1. Przenieś migracje i przeprowadź migrację
  4. Usuń pole default = 1 w polu klucza obcego.

Mam nadzieję, że to pomoże. To rozwiązanie będzie działać za każdym razem, gdy napotkasz taki błąd.

-1

Oto co robię:

  1. zmianę requirement = models.ForeignKey(Requirement) do requirement = models.ForeignKey(Requirement, null=True)
  2. makemigrations bieg i migrować
  3. powrócić do requirement = models.ForeignKey(Requirement)requirement = models.ForeignKey(Requirement, null=True)
  4. run makemigrations i przenieść ponownie.

Chyba zasadę Django ORM o ForeignKey jest:

  1. pozwalają ForeignKey być zerowy, gdy najpierw utworzyć tabelę
  2. odrzucenia dodać ForeignKey która jest zerowa, ponieważ ForeignKey z wstawienie danych do tabeli poprzedniej będzie miało wartość zerową, co wbrew programiście pozwoli
  3. zezwolić na zmianę klucza obcego z niezerowego na zerowy.
1

Odpowiedź, którą zaakceptowałeś, zadziała, ale nie jest to właściwe rozwiązanie, ponieważ będziesz mógł przechowywać obiekty bez relacji z innym obiektem i zakładam, że tego nie chcesz.

Po zmianie bazy danych lub usunięciu jej bez usuwania plików migracji, django zrozumie, że istnieje zapełniona baza danych i że zostały już utworzone oba modele, więc jeśli dodasz puste pole wymagane do obiektu już utworzonego, wyniknie w błędzie. Prawidłowe rozwiązanie będzie usunąć pliki migracji (lub zmienić nazwę folderu, po prostu być bezpieczne) i po prostu uruchomić:

python manage.py makemigrations  
python manage.py migrate 

Zmieniano: przed mogrations run najpierw usunąć bazy danych lub tabel.

Jeśli po prostu popełnił błąd użytku null=True lub wartość domyślną i nie chcesz, aby oczyścić bazę danych masz inne opcje w zależności od stanu bazy danych:

pierwszy przypadek: Jeśli każdy wizyjne obiekt już odniesieniu do użytkownik może po prostu usunąć null=True lub default="" i uruchom:

python manage.py makemigrations 

i po:

python manage.py migrate 

drugim przypadku: Jeśli niektóre pola użytkownika są nieważne lub wartość domyślną, która nie jest użytkownikiem, a następnie trzeba będzie uruchomić niestandardową SQL ustawić każde pole do domyślnej USER_ID przed usunięciem null=True lub the default="" i bieg migracje.

Jednak zakładam, że pierwszy przypadek będzie wystarczający dla ciebie, jeśli nie chcesz usunąć bazy danych, przypuszczam, że wypełniłeś pole użytkownika odpowiednimi danymi. Chciałem dać opcję, jeśli ktoś ma taką sytuację.

1

Większość tego rodzaju situtions nie są problemem nie dodanie plików do modelu (przy użyciu makemigrations i migrują)

ale z powodu niewłaściwych błędów w rodzaju modeli i form Fields (tu było spowodowane inproper składni błąd klucza obcego)

Więc najpierw patrz: https://www.djangoproject.com/

Nie może być również inne przyczyny:

Czasami Bazy se uzyskać zaludnionych i będzie przyjmować tylko dla Nullable Wartość (Ten błąd jest dość częste w nowej wersji Django

SO także ustawić warunek (null == true) w modelu

0

Problem czasami się dzieje, gdy wprowadzić wiele zmian w pliku models.py (w moim przypadku był związany z polem nienadającym się do renderowania ImageField). Zamiast problemów w terenie. Jednym z rozwiązań w Django 2.0.2, Python 3.6.4, MySQL 5.7.21

  • Usuń wszystkie pliki w folderze migracje general_app/migrations/*.py wyjątkiem __init__.py, bądź ostrożny.

Można sprawdzić, czy problem został rozwiązany, jeśli nie:

  • Powtórz powyższy krok, a
  • Usuń bazę danych (np w mysql mysql> DROP DATABASE <name_db>)
  • Teraz utwórz nową o tej samej nazwie mysql> CREATE DATABASE <name_db>.

Te czynności naprawiły problem w moim przypadku. Teraz można uruchomić bez błędów:

$ python manage.py makemigrations 
$ python manage.py migrate 
Powiązane problemy