‘NOT NULL-beperking mislukt’ na toevoeging aan models.py

Ik gebruik userena en nadat ik de volgende regel aan mijn models.py heb toegevoegd

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

Ik krijg de volgende foutmelding nadat ik op de verzendknop op het aanmeldingsformulier heb gedrukt:

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

Mijn vraag is wat deze fout betekent en heeft dit te maken met Userena?


Antwoord 1, autoriteit 100%

U moet een migratie maken, waarbij u de standaardwaarde voor een nieuw veld opgeeft, aangezien u niet wilt dat het null is. Als null niet vereist is, voegt u eenvoudig null=Truetoe en maakt en voert u de migratie uit.


Antwoord 2, autoriteit 12%

@coldmind antwoord is correct maar bevat geen details.

De ‘NOT NULL-beperking is mislukt’ treedt op wanneer iets probeert Geen in te stellen op de eigenschap ‘zipcode’, terwijl dit niet expliciet is toegestaan.

Het gebeurt meestal wanneer:

1) uw veld heeft standaard Null=False, zodat de waarde in de database niet Geen (dwz ongedefinieerd) kan zijn wanneer het object wordt gemaakt en opgeslagen in de database (dit gebeurt na een aanroep van objects_set.create() of de eigenschap .zipcode instellen en een .save()-aanroep doen).

Als ergens in uw code bijvoorbeeld een opdracht resulteert in:

model.zipcode = None

deze fout is gemeld

2) Bij het maken of bijwerken van de database is Django beperkt om een ​​standaardwaarde te vinden om het veld te vullen, omdat NULL = FALSE standaard standaard. Het vindt er niet, omdat u niet hebt gedefinieerd. Dus deze fout kan niet alleen plaatsvinden tijdens de uitvoering, maar ook bij het maken van de database?

3) Merk op dat dezelfde fout wordt geretourneerd van u definieert standaard = geen, of als uw standaardwaarde met een onjuiste type, bijvoorbeeld standaard = ‘00000’ in plaats van 00000 voor uw veld (misschien kan er een automatische conversie zijn tussen Char en gehele getallen, maar ik zou adviseren om erop te vertrouwen. Trouwens, expliciet is beter dan impliciet). Hoogstwaarschijnlijk zou een fout ook worden verhoogd als de standaardwaarde de Max_Length-eigenschap schendt, b.v. 123456

Dus u moet het veld definiëren met een van de volgende:

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)

en maak vervolgens een migratie (python3 beheren.py makemigratie) en vervolgens migreren (Python3 beheren.py migreren).

Voor veiligheid kunt u ook de laatste mislukte migratiebestanden verwijderen in & lt; app_name & gt; / migraties /, er zijn meestal genoemd naar dit patroon:

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

Ten slotte, als u niet null = true instelt, zorg er dan voor dat de modus.zipcode = geen nooit is gedaan.


Antwoord 3, Autoriteit 10%

Als het veld ZIPCODE niet een verplicht veld is, voeg dan NULL = TRUE en blanco = true toe, voer vervolgens MAKEMIGRATIES uit en migreer opdracht om de wijzigingen in de database met succes weer te geven.


Antwoord 4

In de models.py moet je null=Truetoevoegen aan het postcodeveld.


Antwoord 5

Omdat u een nieuwe eigenschap aan het model heeft toegevoegd, moet u eerst de database verwijderen. Vervolgens manage.py migraties en vervolgens manage.py migreren.

Other episodes