2012-04-07 3 views
3

Ich habe eine App entfernt, die ein paar benutzerdefinierte Felder aus meinem Projekt enthielt. Wenn ich jetzt versuche, meine Migrationen auszuführen, bekomme ich natürlich ImportError. Diese Felder waren sehr grundlegende Anpassungen wie folgt:Wie spotze ich ein benutzerdefiniertes Feld, das gelöscht wird, damit Migrationen im Süden ausgeführt werden?

from django.db.models.fields import IntegerField 

class SomeField(IntegerField): 
    def get_internal_type(self): 
     return "SomeField" 

    def db_type(self, connectio=None): 
     return 'integer' 

    def clean(self, value): 
     # some custom cleanup 
     pass 

Also keine von ihnen enthalten Anpassungen auf Datenbankebene.

Wenn ich diesen Code entfernt habe, habe ich Migrationen erstellt, so dass die anschließende Migration alle lief. Aber wenn ich versuche, sie auf einer Datenbank vor dem Löschen auszuführen, habe ich meinen Fehler bemerkt.

Ich kann eine einfache App neu erstellen und diese Importe funktionieren, aber im Idealfall würde ich gerne wissen, ob South einen Mechanismus zur Lösung dieser Probleme hat? Oder gibt es Best Practices? Es wäre cool, wenn ich diese Probleme nur dadurch lösen könnte, dass ich meine Migrationen ändere und die Codebasis nicht berühre.

(Django 1.3, Süd-0.7.3)

Antwort

2

Süd eine Referenz von gelöschten Feld nicht in später Migrationen halten. Wenn Sie das benutzerdefinierte Feld gelöscht und die Migration erfolgreich durchgeführt haben, wird ImportError wahrscheinlich dadurch verursacht, dass diese angepassten Felder weiterhin von einigen rückgängig gemachten Migrationen vor der Löschmigration referenziert werden. So

  1. Update die Code-Basis auf die Version rechts, bevor Sie die Verpackung entferne tun und Löschen Migration
  2. migrieren
  3. Update Codebasis zur Löschung Migration und Migration
+0

Richtig. Aber ich möchte Optionen erkunden, die nicht das Zurückspulen meines VCS beinhalten. Schließlich sollte ich in der Lage sein, eine Datenbank mit HEAD zu erstellen. – muhuk

+0

@muhuk Ich habe keine Ahnung, dass es so etwas gibt. Sie können jedoch Migrationen so lange ändern, wie es in der Logik richtig ist und gut für das Schema in der Produktions-DB und das Generieren der Test-DB funktioniert. Sie können beispielsweise einfach die zuletzt hinzugefügten Migrationen löschen und dann ein Feld entfernen oder Modellzeilen in Migrationsdateien ändern, um ein bestimmtes Feld zu löschen. Mach es sorgfältig. – okm

1

Eine solche einfache benutzerdefinierte Felder sind sehr einfach mit South 0.7+ wenn add_introspection_rules [1] für sie definiert wurden. (im selben Modul nach der benutzerdefinierten Feldklasse), wenn die Migration erstellt wurde. Dann friert Süd diese Felder nicht ein und sie können leicht entfernt werden. Wenn die vorherige Antwort von OKM Ihnen nicht weiterhilft, erstellen Sie die alte Migrationskorrektur erneut.

Verwandte Themen