2016-06-11 10 views
3

Wie bei den django-Dokumenten beim Erstellen von Django-Migrationen sollten wir apps.get_model() verwenden, anstatt die Modelle zu importieren und zu verwenden.Warum apps.get_model() beim Erstellen einer Datenmigration verwenden?

Warum funktioniert eine Datenmigration haben die historische Version eines Modells zu verwenden, anstatt spätestens ein? (Die historischen Versionen des Modells sowieso nicht richtig im Einsatz sein?)

Antwort

7

Es nutzt die historischen Versionen das Modell, damit es keine Probleme beim Zugriff auf Felder gibt, die möglicherweise nicht mehr in der Codebasis vorhanden sind, wenn Sie Ihre Migrationen für eine andere Datenbank ausführen.

Wenn Sie ein Feld aus Ihrem Modell entfernt haben und anschließend Ihre Migrationen in einer neuen Datenbank ausführen möchten und Ihre Modelle direkt importiert haben, können Sie davon ausgehen, dass Ihre Migrationen sich bei der Verwendung eines nicht vorhandenen Felds beschweren würden. Wenn Sie apps.get_model(...) verwenden, wird Django versuchen, schlau zu sein und die Definitionen von migrations.AddField(...) aus Ihren Migrationsdateien zu verwenden, um Ihnen zu diesem Zeitpunkt die korrekte Version Ihres Modells zu geben.

Aus diesem Grund empfiehlt Django, bei der Datenmigration auf die Verwendung benutzerdefinierter Model/Model Manager-Methoden zu achten, da diese Methoden aus dem Migrationsverlauf nicht wiederhergestellt werden können oder sich das Verhalten im Laufe der Zeit ändern kann Migrationen wären nicht konsistent.

+0

Wenn ich ein Feld in einem Modell zu entfernen, würde ich meine Migration nur auf die Bereiche konzentrieren wollen, die vorhanden sind und nicht auf dem Feld entfernt. Wenn Django sich beschwert, dass ich versuche, ein Feld zu benutzen, das nicht existiert, dann wollen wir, dass Django sich beschweren, richtig? – user3282666

+0

Django könnte über eine Datenmigration sprechen, die vor 6 Monaten geschrieben wurde, als die Modelle komplett anders waren, aber dass die Datenmigration noch genauso wie vor 6 Monaten funktioniert. Es sollte sich nicht über ein fehlendes Feld in Ihrem aktuellen Modell beschweren, da die Datenmigration nicht für das aktuelle Modell entwickelt wurde, sondern für eine bestimmte Version Ihres Modells. – ARJMP

+0

Danke! So dumm, dass ich an dieses Szenario nicht denken konnte – user3282666

0

Betrachten Sie dieses Modell:

class A(models.Model): 
    field1 = models.PositiveIntegerField() 
    field2 = models.PositiveIntegerField() 

Ihre Migrationsgeschichte kennt diese beiden Bereiche und jede weitere Migration wird dieses Modell Zustand betrachtet und Änderungen an diesem Modell vornehmen.

Angenommen, Sie entfernen Feld 1 und das Modell wird:

class A(models.Model): 
    field2 = models.PositiveIntegerField() 

Und in der Migration, Sie versuchen, field1 zu verwenden, sollte wissen, dass django field1 existierte. Wenn wir also apps.get_model() verwenden, hilft es Django, den vorherigen Migrationsverlauf zu verwenden und über field1 zu schließen. Anderenfalls erhalten Sie einen Fehler.

(Edit: Fixing Tippfehler in der Antwort)

Verwandte Themen