Ich möchte einen Namen für bestimmte Felder in einem Modell ändern:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
sollte sich ändern zu:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Was ist der einfachste Weg, dies mit South zu tun?
python
django
django-models
django-south
Jonathan
quelle
quelle
Antworten:
Sie können die
db.rename_column
Funktion verwenden.Das erste Argument von
db.rename_column
ist der Tabellenname. Daher ist es wichtig, sich daran zu erinnern, wie Django Tabellennamen erstellt :In dem Fall, in dem Sie einen mehrwortigen Modellnamen mit Kamelgehäuse haben, wie z. B. ProjectItem, lautet der Tabellenname
app_projectitem
(dh es wird kein Unterstrich zwischenproject
und mititem
Kamelgehäuse eingefügt ).quelle
Folgendes mache ich:
myapp/models.py
)../manage.py schemamigration myapp renaming_column_x --auto
Hinweis
renaming_column_x
kann beliebig sein. Es handelt sich lediglich um eine Möglichkeit, der Migrationsdatei einen beschreibenden Namen zu geben.Dadurch wird eine Datei mit dem Namen generiert
myapp/migrations/000x_renaming_column_x.py
die Ihre alte Spalte löscht und eine neue Spalte hinzufügt.Ändern Sie den Code in dieser Datei, um das Migrationsverhalten in eine einfache Umbenennung zu ändern:
quelle
x
odercolumn_x
?--auto
erste Erstellen der Migration ist ein guter Tipp. Es vermeidet Probleme mit dem Süden ORM Freezer, der nur dann , wenn die Migration auftreten hatforwards
undbackwards
Methoden, aber enthält nicht das gefrorenemodel
Objekt.db.rename_column
die mit der Spalte verbundenen Einschränkungen nicht umbenannt werden . Die Migration funktioniert weiterhin, aber Sie haben Einschränkungen, die nach dem alten Spaltennamen benannt sind. Ich hatte eine Spalte mit einer Eindeutigkeitsbeschränkung, benannte sie mit dieser Methode um, testete, dass die Eindeutigkeitsbeschränkung noch vorhanden war, und bekam einen Fehler, aber der Name der Einschränkung selbst verwendete immer noch den alten Spaltennamen. Vielleicht eine explizitedb.delete_unique
unddb.create_unique
hätte es getan, aber ich entschied mich für sjhs Lösung.Ich wusste nichts über die Spalte db.rename, klingt praktisch, aber in der Vergangenheit habe ich die neue Spalte als eine Schemamigration hinzugefügt, dann eine Datenmigration erstellt, um Werte in das neue Feld zu verschieben, und dann eine zweite Schemamigration, um die alte Spalte zu entfernen
quelle
db.rename_column
benennt Einschränkungen nicht für Sie um, daher müssen Sie diese manuell behandeln. Wenn Sie dies vergessen , funktioniert die Migration mit der Ausnahme, dass ohne Ihr Wissen möglicherweise noch eine Einschränkung mit dem alten Spaltennamen vorliegt. Es ist mir unklar, ob das Problem nur kosmetischer Natur ist oder ob es in einer zukünftigen Migration, in der die Einschränkung manipuliert oder nach Süden fallen gelassen werden sollte, nicht in der Lage sein wird, es zu finden. Auf jeden Fall ist es der sichere Weg, dies hier zu tun, wie es sjh vorschlägt: Sie können South herausfinden lassen, was es herausfinden sollte.Mit Django 1.7 wurden Migrationen eingeführt, sodass Sie jetzt nicht einmal mehr ein zusätzliches Paket installieren müssen, um Ihre Migrationen zu verwalten.
Um Ihr Modell umzubenennen, müssen Sie zuerst eine leere Migration erstellen:
Dann müssen Sie den Code Ihrer Migration wie folgt bearbeiten:
Und danach müssen Sie laufen:
quelle
Ändern Sie einfach das Modell und führen Sie
makemigrations
1.9 ausDjango erkennt automatisch, dass Sie ein einzelnes Feld gelöscht und erstellt haben, und fragt:
Sagen Sie "Ja" und die richtige Migration wird erstellt. Magie.
quelle
south
Ihren installierten Apps in der Projekteinstellungsdatei hinzu.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Wenn Sie 'pycharm' verwenden, können Sie 'ctrl + shift + r' anstelle von 'manage.py' und 'shift' für Parameter verwenden.
quelle