2016-03-29 9 views
6

Unter Verwendung von migrations muss ich ein neues Feld (einen Fremdschlüssel) zu einem Modell hinzufügen. Ich weiß, dass es getan werden kann mit:Standardwert für Fremdschlüssel in Django migrations.AddField

migrations.AddField(
     model_name='MyModel', 
     name='state', 
     field=models.ForeignKey(null=True, related_name='mymodel_state', to='msqa_common.MyModelState'), 
    ), 

Allerdings möchte ich nicht mein Feld Nullable sein. Stattdessen möchte ich einen Standardwert dafür verwenden, der der ID von MyModelState entspricht, deren Name "verfügbar" ist (der ID-Wert kann sich auf verschiedenen Computern ändern). Dieser "verfügbare" Wert der Tabelle MyModelState wird in einem früheren Migrationsskript in die Datenbank eingefügt, ist also vorhanden.

Ich denke, ich sollte so etwas tun:

migrations.AddField(
     model_name='MyModel', 
     name='state', 
     field=models.ForeignKey(null=False, default=available_state_id, related_name='mymodel_state', to='msqa_common.MyModelState'), 
    ), 

Meine Frage: Wie kann ich die available_state_id in meinem Migrationsscript bekommen?

Antwort

16

Sie können es nicht direkt tun. Die empfohlene Vorgehensweise besteht darin, eine Migration zu erstellen, um sie mit null = True hinzuzufügen. Fügen Sie dann eine Datenmigration mit Python oder SQL hinzu, um alle vorhandenen auf available_state_id zu aktualisieren, und anschließend eine dritte Migration, die sie in null ändert = Falsch.

+0

Danke Daniel. Kennen Sie eine Dokumentation, in der dieser Prozess erklärt wird? – eelioss

+2

https://docs.djangoproject.com/en/1.9/howto/writing-migrations/#migrations-that-add-unique-fields –