Ich weiß, dass ich ab Django 1.7 weder South noch ein anderes Migrationssystem verwenden muss, also verwende ich nur einen einfachen Befehl python manage.py makemigrations
Ich erhalte jedoch nur diesen Fehler:
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).
Hier ist models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
Was sind Optionen?
Antworten:
Sie müssen einen Standardwert angeben:
quelle
default = website
macht den Job nichtnew_field
zuwebsite
.Wenn Sie sich in einem frühen Entwicklungszyklus befinden und sich nicht um Ihre aktuellen Datenbankdaten kümmern, können Sie diese einfach entfernen und dann migrieren. Aber zuerst müssen Sie das Migrationsverzeichnis bereinigen und die Zeilen aus der Tabelle entfernen (django_migrations).
quelle
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
__init__.py
Stellen Sie außerdem sicher, dass Sie die Migrationen nicht löschen oder anschließend wiederherstellen, da Makemigrationen sonst nicht funktionieren. Stackoverflow.com/a/46362750/1649917python manage.py sqlmigrate name_of_your_app nb_of_the_migration
ist auch erforderlichEine Möglichkeit besteht darin, einen Standardwert für 'new_field' zu deklarieren:
Eine andere Möglichkeit besteht darin, 'new_field' als nullbares Feld zu deklarieren:
Wenn Sie 'new_field' als nullbares Feld akzeptieren, möchten Sie möglicherweise 'no input' als gültige Eingabe für 'new_field' akzeptieren. Dann müssen Sie auch die
blank=True
Anweisung hinzufügen :Auch mit
null=True
und / oder könnenblank=True
Sie bei Bedarf einen Standardwert hinzufügen:quelle
Wenn Sie früh im Entwicklungszyklus sind, können Sie dies versuchen -
Entfernen / kommentieren Sie dieses Modell und alle seine Verwendungen. Migrationen anwenden. Das würde dieses Modell löschen und dann das Modell erneut hinzufügen, Migrationen ausführen und Sie haben ein sauberes Modell mit dem neuen Feld hinzugefügt.
quelle
Wenn "Website" leer
new_field
sein kann, sollte auch "leer" gesetzt werden.Wenn Sie nun beim Speichern eine Logik hinzufügen möchten, bei der if
new_field
leer ist, um den Wert von "website" abzurufen, müssen Sie lediglich die Speicherfunktion für Folgendes überschreibenModel
:quelle
Wenn jemand a
ForeignKey
festlegt, können Sie einfach nullbare Felder zulassen, ohne einen Standard festzulegen:Wenn Sie bereits Daten in der Datenbank gespeichert haben, können Sie auch einen Standardwert festlegen:
quelle
Sie können keinen Verweis auf eine Tabelle hinzufügen, in der sich bereits Daten befinden.
Veränderung:
zu:
machen:
wieder ändern:
Führen Sie die Migration erneut durch:
quelle
Fügen Sie in new_file die boolesche Eigenschaft null hinzu.
Nachdem Sie eine
./manage.py syncdb
Aktualisierung der Datenbank ausgeführt haben. und schließlich rennst du./manage.py makemigrations
und./manage.py migrate
quelle
Sie können die Methode von Django Doc auf dieser Seite https://docs.djangoproject.com/de/1.8/ref/models/fields/#default verwenden
Standard erstellen und verwenden
quelle
Haben Sie bereits Datenbankeinträge in der Tabelle
UserProfile
? Wenn ja, wenn Sie neue Spalten hinzufügen, weiß die Datenbank nicht, auf was sie eingestellt werden soll, da dies nicht möglich istNULL
. Daher werden Sie gefragt, auf was Sie diese Felder in der Spalte setzen möchtennew_fields
. Ich musste löschen alle Zeilen aus dieser Tabelle , um das Problem zu lösen.(Ich weiß, dass dies vor einiger Zeit beantwortet wurde, aber ich bin gerade auf dieses Problem gestoßen und dies war meine Lösung. Hoffentlich hilft es jedem, der dies sieht.)
quelle
Ich glaube ehrlich, der beste Weg, dies zu umgehen, bestand darin, einfach ein anderes Modell mit allen Feldern zu erstellen, die Sie benötigen, und etwas anders zu benennen. Führen Sie Migrationen aus. Löschen Sie nicht verwendetes Modell und führen Sie die Migrationen erneut aus. Voila.
quelle
Wenn Sie die Tabelle des betreffenden Modells abschneiden können, können Sie
None
in der Eingabeaufforderung einen einmaligen Standardwert von angeben . Die Migration ist überflüssig,default=None
während Ihr Code keine Standardeinstellung hat. Es kann problemlos angewendet werden, da die Tabelle keine Daten mehr enthält, für die eine Standardeinstellung erforderlich wäre.quelle
Ich war früh in meinem Entwicklungszyklus, daher funktioniert dies möglicherweise nicht für alle (aber ich verstehe nicht, warum dies nicht der Fall ist).
Ich habe
blank=True, null=True
zu den Spalten hinzugefügt, in denen ich den Fehler erhalten habe. Dann habe ich denpython manage.py makemigrations
Befehl ausgeführt.Unmittelbar nach dem Ausführen dieses Befehls (und vor dem Ausführen
python manage.py migrate
) habe ich dasblank=True, null=True
aus allen Spalten entfernt. Dann rannte ichpython manage.py makemigrations
wieder. Ich hatte die Möglichkeit, die von mir ausgewählten Spalten einfach selbst zu ändern.Dann bin ich gelaufen
python manage.py migrate
und alles hat gut funktioniert!quelle
Was Django tatsächlich sagt, ist:
Wenn Sie sicher sind, dass keiner der Werte in der
userprofile
Tabelle NULL ist, können Sie die Warnung ignorieren.In solchen Fällen empfiehlt es sich, eine RunPython-Migration zu erstellen, um leere Werte zu verarbeiten, wie in Option 2 angegeben
Bei der RunPython-Migration müssen Sie alle
UserProfile
Instanzen mit leeremnew_field
Wert finden und dort einen korrekten Wert eingeben (oder einen Standardwert, den Django im Modell festlegen soll). Sie werden so etwas bekommen:Habe Spaß!
quelle
In 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")
Sie müssen standardmäßig einige Werte hinzufügen.
quelle
Wenn die SSH Ihnen 2 Optionen bietet, wählen Sie Nummer 1 und geben Sie "Keine" ein. Nur das ... für den Moment.
quelle