IntegerField - nie chce wyświetlić

34 views
Skip to first unread message

killerbees1982

unread,
Jan 12, 2017, 9:33:25 AM1/12/17
to django-pl - grupa polskiej społeczności Django
Żeby nie mieszać tematów to kolejny mój problem.
Oczywiście chodzi znów o klasę. Dodaje wartość, która ma wskazywać na numer NIP pracodawcy:

nip = models.IntegerField()

No i przy komendzie python manage.py makemigrations wyskakuje takie coś:

You are trying to add a non-nullable field 'nip' to firma without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option:


To samo tyczy się TextField. Czy muszę wpisać jakąś wartość w nawiasach?

Bartłomiej Opajdowski

unread,
Jan 12, 2017, 9:38:35 AM1/12/17
to djan...@googlegroups.com
w modelu dodaj : default='' 

--
Otrzymujesz tę wiadomość, bo subskrybujesz grupę „django-pl - grupa polskiej społeczności Django” w Grupach dyskusyjnych Google.
Aby anulować subskrypcję tej grupy i przestać otrzymywać od niej wiadomości, wyślij e-maila na django-pl+unsubscribe@googlegroups.com.
Aby opublikować wpis w tej grupie, wyślij e-maila na djan...@googlegroups.com.
Otwórz tę grupę na https://groups.google.com/group/django-pl.
Więcej opcji znajdziesz na https://groups.google.com/d/optout.



--
pozdrawiam
Bartłomiej Opajdowski

Andrzej

unread,
Jan 12, 2017, 9:39:00 AM1/12/17
to django-pl - grupa polskiej społeczności Django
A czy próbowałeś przejść tutorial z django? Tam są takie podstawy chyba opisane. Naprawdę warto.

Tu problem dotyczy "migracji", tak?

Zatem musisz wybrać czy dane, które masz obecnie w bazie mogą mieć pustą wartość w polu NIP. I masz szybki wybór: 
 1) podać konkretną wartość jaką powinny otrzymać istniejące już firmy - możesz chyba podać pusty cudzysłów: ""
 2) przerwać i w definicji pola ustawić jakąś wartość default

W dniu 12 stycznia 2017 15:33 użytkownik killerbees1982 <killerb...@gmail.com> napisał:

--

Bartłomiej Opajdowski

unread,
Jan 12, 2017, 9:39:02 AM1/12/17
to djan...@googlegroups.com
znaczy w polu gdzie kombinujesz jak koń pod górę z tym TextField(default='') 
--
pozdrawiam
Bartłomiej Opajdowski

killerbees1982

unread,
Jan 12, 2017, 9:53:34 AM1/12/17
to django-pl - grupa polskiej społeczności Django
Wiem panowie że kombinuję, ale tutorial przeglądałem ten na docs i djangogirls i tam wartości np. przy TextField były puste.
Wklepałem Bartek jak napisałeś i wywala mi :

ValueError: invalid literal for int() with base 10: ''

killerbees1982

unread,
Jan 12, 2017, 10:28:17 AM1/12/17
to django-pl - grupa polskiej społeczności Django
Ok. zadziałało ale nie wiem dlaczego. Po prostu usunąłem cały projekt i przepisałem kod od nowa i integer oraz text pokazały się.

Andrzej

unread,
Jan 12, 2017, 10:31:21 AM1/12/17
to django-pl - grupa polskiej społeczności Django
Zadziałało, ale będziesz mozesz trafić podobny problem podczas przyszłych migracji bazy. poczytaj o migracjach, reszta przyjdzie z czasem

W dniu 12 stycznia 2017 16:28 użytkownik killerbees1982 <killerb...@gmail.com> napisał:
Ok. zadziałało ale nie wiem dlaczego. Po prostu usunąłem cały projekt i przepisałem kod od nowa i integer oraz text pokazały się.

--

killerbees1982

unread,
Jan 12, 2017, 10:38:30 AM1/12/17
to django-pl - grupa polskiej społeczności Django
Andrzej najprawdopodobniej coś musiałem gdzieś zdefiniować bo wcześniej co bym nie wpisywał i nie tworzył jakiegokolwiek pola to wyskakiwał błąd int. Nawet jak usunąłem całą linijkę to przy migracji cały czas ten sam błąd odnośnie int() chociaż już jej tam nie było.

Andrzej

unread,
Jan 12, 2017, 2:30:13 PM1/12/17
to django-pl - grupa polskiej społeczności Django
I to wszystko, co się działo u Ciebie ma sens :)
Tak działają migracje. Pozwól, że nieco się rozpiszę, aby podać stosowny przykład, drogi czytelniku. A innych czytelników poproszę o skorygowanie myśli, bo mogę sypnąć czymś niewłasciwym, piszę z pamięci, dawno nie używałem Django.

Wyobraź sobie, że masz model Firma z polem "name". Tworzysz migrację. w Ty momencie w tabeli w bazie mamy tylko owo pole "name".

Mając taki model, tworzysz sobie swój pierwszy wpis w bazie: Company(name="Killer Bees") i wszystko gra.

Teraz wpadasz na pomysł, aby dodać owo pole - nip. Zatem dodajesz nowe pole "nip" do modelu, które to pole domyślnie jest wymagane (bo nie podałeś parametrów null=True) oraz nie ma domyślnej wartości (bo nie podałeś default="xxx")
Zapisujesz pliki i wywołujesz "makemigrations", które to ma zaktualizować schemat bazy poprzez dodanie nowej kolumny "nip" do tabeli "companies"...

Ale, ale! Mamy problem!
Co się stanie z tą firmą "Killer Bees", którą utworzyliśmy parę linijek wyżej? Problem mamy taki, że my chcemy dodać nową kolumnę do tabeli, która nie może być NULL (wspomniałem powyżej), ale firma "Killer Bees" już istnieje w tej tabeli i jeśli dodamy taką kolumnę, to ona automatycznie będzie właśnie miała wartość NULL, no bo nie daliśmy jej domyślnej wartości..

Dlatego właśnie skrypt migracji podpowiada 2 opcje, które możesz zrobić. 
 1) podanie konkretnej wartości (np. wiesz, że każda istniejąca już firma powinna mieć w nowododanym polu wartość "3") - u Ciebie powinno pomóc np podanie tam wartości "0" i wiedziałbyś wtedy, że każda firma z nipem równym "0" wymaga aktualizacji danych. 
 2) przerwać migrację i dodać wartość domyślną - tutaj własnie chodzi o to zdefiniowanie pola z podaniem default="XXX", gdzie "XXX" u Ciebie musiałoby być liczbą, no bo dodajesz pole INT. Dlatego nie zadziałały nasze poprzednie podpowiedzi.

Miej na uwadze, że oba rozwiązania są podobne, jednak działają inaczej - drugie automatycznie ustawia tę domyślną wartość, jeśli Ty wyraźnie nie podasz innej podczas tworzenia Firmy. Zatem walidacja formularza może być bardziej uciążliwa, bo pole zostanie wypełnione "defaultem", a Ty chciałeś mieć je wymagane w formularzu..


A teraz bonus - dlaczego to zadziałało, kiedy usunąłeś wszystko i zacząłeś od nowa? Bo Django tworzyło wtedy dopiero PIERWSZĄ migrację i system jest pewny, że w bazie nie istnieje jeszcze żadna firma, która mogła by mieć to pole puste. Tyle.

To chyba wszystko. 
Jeśli ktoś ma siłę przeczytać i poprawić - zapraszam ;)




W dniu 12 stycznia 2017 16:38 użytkownik killerbees1982 <killerb...@gmail.com> napisał:
Andrzej najprawdopodobniej coś musiałem gdzieś zdefiniować bo wcześniej co bym nie wpisywał i nie tworzył jakiegokolwiek pola to wyskakiwał błąd int. Nawet jak usunąłem całą linijkę to przy migracji cały czas ten sam błąd odnośnie int() chociaż już jej tam nie było.

--

Marcin Kallas

unread,
Jan 13, 2017, 3:40:27 AM1/13/17
to django-pl - grupa polskiej społeczności Django
Właściwie to nie ma co tu poprawiać. Tak właśnie to działa. Można ewentualnie zrobić obejście i edytować plik migracji (choć nie jestem pewien czy nie zwróci błędu jeśli baza już istnieje) lub zamiast tego stosować bezpośrednie zapytania SQL zamiast ORM (tylko właściwie po co).

Najlepsze rozwiązanie to to co napisał Andrzej czyli dodać wartość domyślną jako argument funkcji IntegerField, a więc default=0 (albo inna liczba), a jeszcze lepiej zrobić pole nieobowiązkowe dając w argumencie null = True, a w przypadku pól tekstowych blank = True. W ten sposób jeśli pole jest null lub blank możesz w widoku wyświetlać komunikat o konieczności uzupełnienia.
Reply all
Reply to author
Forward
0 new messages