‘NOT NULL constraint failed’ după adăugarea la models.py (Programare, Django, Modele Django)

stephan a intrebat.

Folosesc userena și după ce am adăugat următoarea linie în models.py

zipcode = models.IntegerField(_('zipcode'),
                                   max_length=5)

Primesc următoarea eroare după ce apăs butonul de trimitere din formularul de înscriere:

IntegrityError at /accounts/signup/
NOT NULL constraint failed: accounts_myprofile.zipcode

Întrebarea mea este ce înseamnă această eroare și dacă are legătură cu Userena?

Comentarii

  • Ați rulat migrații? Django, în mod implicit, nu ar prelua modificările aduse modelelor. În plus, dacă nu specificați null=True, blank=True, acesta devine un câmp obligatoriu –  > Por karthikr.
  • Setarea null și blank nu schimbă nimic. Nici măcar ștergerea atributului nu ajută. –  > Por Sören.
5 răspunsuri
coldmind

Trebuie să creați o migrație, în care să specificați valoarea implicită pentru un câmp nou, deoarece nu doriți ca acesta să fie nul. Dacă nu este necesar să fie nul, pur și simplu adăugați null=True și creați și rulați migrația.

Comentarii

  • Notă: este posibil să trebuiască să ștergeți fișierele de migrare deja prezente înainte de a rula din nou makemigrations și de a migra. –  > Por lolesque.
  • Migrațiile nu se execută după ce această eroare s-a produs o dată. –  > Por Sören.
  • @lolesque soluțiile dvs. au funcționat pentru mine, în cazul meu a trebuit să șterg și db.sqlite3, mulțumesc! –  > Por Stack.
Mahendra Yadav

dacă câmpul zipcode nu este un câmp obligatoriu, atunci adăugați null=True și blank=True, apoi rulați comanda makemigrations și migrate pentru a reflecta cu succes modificările în baza de date.

Jean-Michel M.

Răspunsul lui @coldmind este corect, dar îi lipsesc detaliile.

„NOT NULL constraint failed” apare atunci când ceva încearcă să seteze None la proprietatea „zipcode”, deși nu a fost permis în mod explicit.

De obicei, se întâmplă atunci când:

1) câmpul dvs. are Null=False în mod implicit, astfel încât valoarea din baza de date nu poate fi None (adică nedefinită) atunci când obiectul este creat și salvat în baza de date (acest lucru se întâmplă după un apel objects_set.create() sau setarea proprietății .zipcode și efectuarea unui apel .save()).

De exemplu, dacă undeva în codul dvs. o atribuire are ca rezultat :

model.zipcode = None

se generează această eroare

2) La crearea sau actualizarea bazei de date, Django este constrânsă să găsească o valoare implicită pentru a completa câmpul, deoarece Null=False în mod implicit. Nu găsește niciuna pentru că nu ați definit niciuna. Deci această eroare nu se poate întâmpla doar în timpul execuției codului, ci și la crearea bazei de date?

3) Rețineți că aceeași eroare ar fi returnată dacă ați defini default=None sau dacă valoarea implicită are un tip incorect, de exemplu default=’00000′ în loc de 00000 pentru câmpul dvs. (poate că poate exista o conversie automată între char și numere întregi, dar vă sfătuiesc să nu vă bazați pe aceasta. În plus, explicit este mai bine decât implicit). Cel mai probabil, o eroare ar fi, de asemenea, generată dacă valoarea implicită încalcă proprietatea max_length, de exemplu, 123456.

Așadar, va trebui să definiți câmpul prin una dintre următoarele metode:

models.IntegerField(_('zipcode'), max_length=5, Null=True,
   blank=True)

models.IntegerField(_('zipcode'), max_length=5, Null=False,
   blank=True, default=00000)

models.IntegerField(_('zipcode'), max_length=5, blank=True,
   default=00000)

și apoi să faceți o migrare (python3 manage.py makemigration ) și apoi să migrați (python3 manage.py migrate).

Pentru siguranță, puteți, de asemenea, să ștergeți ultimele fișiere de migrare eșuate în <app_name>/migrations/, acolo sunt de obicei numite după acest model:

<NUMBER>_auto_<DATE>_<HOUR>.py

În cele din urmă, dacă nu setați Null=True, asigurați-vă că mode.zipcode = None nu se face nicăieri.

Comentarii

  • Ceea ce se cere este să îl păstrați ca câmp obligatoriu. De asemenea, aici este un câmp întreg, fac o cheie străină și aruncă aceeași eroare. Pentru mai multe informații, întrebarea mea –  > Por Ritvik.
Mohamed Stohy

În models.py ar trebui să adăugați null=True la câmpul zipcode.

Ali

Deoarece ați adăugat o nouă proprietate la model, trebuie mai întâi să ștergeți baza de date. Apoi manage.py migrations apoi manage.py migrate.

Comentarii

  • Pentru oricine care dă peste acest răspuns. Rețineți că ștergerea bazei de date NU este necesară atunci când actualizați modelele, ar fi o pacoste uriașă și este puțin probabil să rezolve problema discutată aici. –  > Por Michael Romrell.