Diese Antwort gilt für ähnliche Fälle, wenn die Top-Antwort von Alasdair nicht hilft . (ZB wenn die unerwünschte Migration bei jeder neuen Migration bald wieder erstellt wird oder wenn es sich um eine größere Migration handelt, die nicht zurückgesetzt werden kann oder die Tabelle manuell entfernt wurde.)
... die Migration löschen, ohne eine neue Migration zu erstellen?
TL; DR : Sie können einige zuletzt zurückgesetzte (verwirrte) Migrationen löschen und nach dem Reparieren von Modellen eine neue erstellen . Sie können es auch mit anderen Methoden konfigurieren, um keine Tabelle mit dem Befehl migrate zu erstellen . Die letzte Migration muss so erstellt werden, dass sie mit den aktuellen Modellen übereinstimmt .
Fälle, in denen niemand eine Tabelle für ein Modell erstellen möchte, das vorhanden sein muss:
A) Eine solche Tabelle sollte in keiner Datenbank auf keinem Computer und unter keinen Bedingungen vorhanden sein
- Wann: Es handelt sich um ein Basismodell, das nur für die Modellvererbung eines anderen Modells erstellt wurde.
- Lösung: Einstellen
class Meta: abstract = True
B) Die Tabelle wird selten, von etwas anderem oder manuell auf besondere Weise erstellt.
- Lösung: Verwendung
class Meta: managed = False
Die Migration wird nur in Tests erstellt, aber nie verwendet. Die Migrationsdatei ist wichtig, da sonst Datenbanktests ab dem reproduzierbaren Ausgangszustand nicht ausgeführt werden können.
C) Die Tabelle wird nur auf einigen Maschinen verwendet (z. B. in der Entwicklung).
- Lösung: Verschieben Sie das Modell in eine neue Anwendung, die INSTALLED_APPS nur unter besonderen Bedingungen hinzugefügt wird, oder verwenden Sie eine Bedingung
class Meta: managed = some_switch
.
D) Das Projekt verwendet mehrere Datenbanken insettings.DATABASES
- Lösung: Schreiben Sie einen Datenbankrouter mit Methode,
allow_migrate
um die Datenbanken zu unterscheiden, in denen die Tabelle erstellt werden soll und wo nicht.
Die Migration wird in allen Fällen A), B), C), D) mit Django 1.9+ (und nur in den Fällen B, C, D mit Django 1.8) erstellt, jedoch nur in geeigneten Fällen oder möglicherweise nie auf die Datenbank angewendet erforderlich. Seit Django 1.8 sind Migrationen zum Ausführen von Tests erforderlich. Der vollständige relevante aktuelle Status wird durch Migrationen auch für Modelle mit verwaltetem = Falsch in Django 1.9+ aufgezeichnet, um einen ForeignKey zwischen verwalteten / nicht verwalteten Modellen erstellen zu können oder um das Modell später als verwaltet = wahr zu machen. (Diese Frage wurde zum Zeitpunkt von Django 1.8 geschrieben. Alles hier sollte für Versionen zwischen 1.8 und dem aktuellen 2.2 gültig sein.)
Wenn die letzte Migration nicht leicht rückgängig zu machen ist (sind), ist es möglich, vorsichtig (nach der Datenbanksicherung) eine gefälschte Wiederherstellung durchzuführen ./manage.py migrate --fake my_app 0010_previous_migration
durchzuführen und die Tabelle manuell zu löschen.
Erstellen Sie bei Bedarf eine feste Migration aus dem festen Modell und wenden Sie sie an, ohne die Datenbankstruktur zu ändern ./manage.py migrate --fake my_app 0011_fixed_migration
.