django südliche Migration, setzt nicht Standard

8

Ich benutze Süd, um meine Django-Modelle zu migrieren. Es gibt jedoch einen fiesen Bug im Süden. In Postgres-Datenbanken werden keine Standardwerte festgelegt. Beispiel:

%Vor%

South fügt diese zwei Felder der Datenbank hinzu, kann jedoch ihre Standardwerte nicht manuell festlegen.

Gibt es einen Patch für diesen Fehler?

UPDATE Ich hatte bereits versucht, das Standarddatum mit auto_now_add=True zu setzen, aber das setzt auch keine Standardeinstellungen. Durch das Hinzufügen von null=True im Feld wird ein db.alter_column im von sut erstellten Migrationsskript hinzugefügt. Aber das einzige entfernt die NOT NULL Einschränkung, fügt keinen Standardwert hinzu. Gleich für Integer-Feld

    
jerrymouse 03.04.2012, 10:48
quelle

3 Antworten

11

Das ist kein Fehler, weder in Süden noch anderswo.

Ich denke, Sie sind verwirrt darüber, wie Standardwerte in Django im Allgemeinen funktionieren. Django legt keine Standardwerte im Datenbankschema fest. Sie wendet sie direkt in Python an, wenn eine neue Instanz erstellt wird. Sie können dies überprüfen, indem Sie manage.py sqlall ausführen und sehen, dass das generierte SQL keine default -Attribute enthält.

    
Daniel Roseman 03.04.2012, 11:10
quelle
21

Wenn Sie Ihre Migrationen automatisch generieren, verwenden Sie:

%Vor%

Dann müssen Sie eine kleine Änderung an der Migration vornehmen, bevor Sie sie tatsächlich anwenden. Gehen Sie in die generierte Migration (sollte wie app_name / migrations / 000X__auto_add_field_foo.py heißen) und suchen Sie nach dem Argument:

%Vor%

im Aufruf db.add_column. Ändern Sie das einfach in:

%Vor%

Und Django wird jetzt Ihren Standardwert auf das tatsächliche Schema anwenden, zusätzlich zu allen vorhandenen Zeilen. Wäre toll, wenn South irgendeine Einstellung hätte, um diesen Parameter standardmäßig als True zu erzeugen, aber kein Glück. Sie müssen diese Änderung jedes Mal vornehmen.

    
galarant 04.10.2012 16:40
quelle
2

Wie in früheren Antworten erwähnt, ist der Standardmechanismus in Django in der Modellklasse implementiert und für South-Migrationen nicht relevant.

Seit 0.8 ist das keep_default Flag veraltet , und fügt dem Modell nicht den Standardwert hinzu.

Um dies zu beheben, schreibe ich eine benutzerdefinierte Migration, um den Standardwert hinzuzufügen. Sie können dies tun, indem Sie eine separate Datenmigration erstellen:

%Vor%

und fügen Sie der Funktion forwards die folgende Zeile hinzu:

%Vor%

Alternativ können Sie, anstatt eine neue Migration zu erstellen, Ihre ursprüngliche Migration ändern:

  1. füge no_dry_run = True zur Klasse selbst hinzu (damit du Zugang zum ORM hast).
  2. füge orm.YourModel.objects.update(field_name = DEFAULT_VALUE) zum Ende der forwards Funktion hinzu.

Auf diese Weise müssen Sie keine Rückwärtsmigration schreiben, weil Sie bereits die ursprüngliche Löschspalte haben.

    
Tzach 09.04.2014 15:20
quelle

Tags und Links