2016-05-02 18 views
2

Aus einigen Gründen möchte ich eine große Änderung an meinen Modellen vornehmen. Ich möchte mein gesamtes Design irgendwie überarbeiten, aber die Django-Migrationsimplementierungen berücksichtigen das vorherige Design, indem ich meine Modellbasen nicht aktualisiere.Django - Basen in Migrationen ändern

Lassen Sie mich schnell zeigen, was ich vorher hatte, was ich jetzt habe.

app1.TopLevel 
    |_ app1.IntermediateLevel 
    |_ app2.LowLevel 

hatte ich drei Modelle wie diejenigen, dann jetzt würde Ich mag diesen Entwurf zu etwas mehr auf mein aktuelles Projekt abzuschneiden, wie

app2.TopLevel 
    |_ app2.LowLevel 

Meine wichtigsten Änderungen sind, zuerst I don Ich möchte kein Zwischenmodell mehr, zweitens brauche ich keine Top, halten Sie die app1.TopLevel auf diese Weise.

Ich habe keine Probleme mit den Daten (Ich führe mehrere Migration, einige mit Python, um die Daten in temporäre Felder, dann setzen Sie die Daten im rechten Feld später und entfernen Sie diese temporären Felder).

Mein Problem ist, wenn wir ein geerbtes Modell erstellen, definieren wir seine Basen;

migrations.CreateModel(
     name='IntermediateLevel', 
     fields=[ 
      ('toplevel_ptr', models.OneToOneField(
       auto_created=True, 
       on_delete=django.db.models.deletion.CASCADE, 
       parent_link=True, 
       primary_key=True, 
       serialize=False, 
       to='app1.TopLevel'), 
      ) 
     ], 
     bases=('app1.TopLevel',), 
    ) 

In Fällen, dass würde ich habe so etwas wie

Lokale Feld 'toplevel_ptr' in der Klasse 'LowLevel' Auseinandersetzungen mit Feld ähnlicher Namen aus der Basisklasse ‚IntermediateLevel'`

Ich lese die offizielle Dokumentation und den Quellcode (für Migrationen), aber bis jetzt habe ich nichts davon gesehen. Ist es möglich dem Migrationssystem zu sagen, dass wir eine Modellbasis (seine Eltern) verändert haben?

Andernfalls wäre die einzige Lösung, die ich bekommen würde, neue Modelle zu erstellen, Python-Migrationen ausführen, um die Daten von den alten Modellen auf die neuen zu kopieren. Dann entfernen Sie die alten Modelle und benennen Sie die neuen um, um die gewünschten Namen zu erhalten.

+0

Versuchen Sie das Feld mit einem neuen Feld zu ändern, das mit Ihrer neuen Basisklasse verknüpft ist. –

+0

@mille_a Ich bin jetzt im selben Problem! Ich war die letzten 4 Tage dabei und kann es nicht herausfinden. Wenn ich versuche, die UpperLevelModel-Art wie Ihr IntermediateLevel-Modell vollständig zu entfernen, erhalte ich einen Invalid Bases Error. Können Sie Ihr Problem lösen? Bitte helfen Sie – Nazariy1995

Antwort

-1

Ich hatte auch ein Problem in Bezug auf die Modellbasen zu ändern. In meinem Fall habe ich einen Fehler bei der Definition der Modellvererbung gemacht.

class Foo(WrongModelMixin, models.Model): 
    pass 

damit endete ich mit einer Migration, die wie folgt aussieht:

migrations.CreateModel(
     name='Foo', 
     fields=[ 
      . . . 
     ], 
     bases=(bar.models.WrongModelMixin, models.Model) 
    ), 

Die Sache, die für mich gearbeitet, es ist nicht sehr intuitiv :)

ich das Modell aus der Migration entfernt und endete mit:

migrations.CreateModel(
     name='Foo', 
     fields=[ 
      . . . 
     ], 
     bases=(models.Model,) 
    ), 

ich noch nicht untersucht, warum django berücksichtigt Die Änderungen, die bei bereits ausgeführten Migrationen vorgenommen wurden (das ist der seltsame Teil). Aber du kannst es versuchen.

+0

Die Frage ist, wie Sie die Basisklasse ändern, Ihre Antwort ist nicht relevant. –

Verwandte Themen