2011-09-19 18 views
8

Ho recentemente iniziato a utilizzare South per le migrazioni nel mio progetto Django. Tutto andava bene fino a poco tempo fa, quando mi sono imbattuto in un problema particolare.Quale ordine di migrazione segue il Sud tra diverse app?

Ho due app nel mio progetto, ad esempio App-A e App-B. Un modello in App-A ha una chiave esterna per un modello in App-B. Quando ho provato a creare il mio sistema, ho eseguito syndb che ha creato tutte le tabelle auth_ e south_. Quindi ho eseguito migrate che ha generato errori. Quando ha provato a creare il modello da App-A, che fa riferimento a un modello da App-B, il modello App-B non è stato ancora migrato/creato e quindi l'errore.

Per risolvere questo problema, ho dovuto migrare manualmente prima App-B e poi App-A. Sto facendo qualcosa di sbagliato qui? In che modo South dovrebbe conoscere l'ordine di migrazione tra le app?

Grazie.

risposta

16

Questo lo ha spiegato https://south.readthedocs.io/en/latest/dependencies.html.

migrazioni per le applicazioni sono belli 'n tutto, ma quando si inizia a scrivere un grande progetto , con un sacco di applicazioni, si accorge di avere stranieri chiave relazioni tra le applicazioni e capire di che cosa migrazioni ordine sarebbe necessità essere applicato per ogni app è solo doloroso.

Fortunatamente, abbiamo avuto anche questo problema, quindi South ha un sistema di dipendenza. All'interno di una migrazione, è possibile dichiarare che dipende dall'avere un'altra app che esegue prima una determinata migrazione; per esempio, se la mia app “forum” dipende dai “conti” app dopo aver creato il proprio profilo utente tavolo, siamo in grado di fare:

# forum/migrations/0002_post.py class Migration: 

    depends_on = (
     ("accounts", "0003_add_user_profile"), 
    ) 

    def forwards(self): 

Quindi, se si cerca di migrazione o di là 0002_post nel forum app, si assicurerà innanzitutto che gli account vengano migrati almeno a fino a 0003_add_user_profile e, in caso contrario, eseguiranno la migrazione per te.

Le dipendenze funzionano anche al contrario; South sa di non annullare quella migrazione 0003_add_user_profile fino a quando non ha annullato la migrazione 0002_post .

È possibile avere più dipendenze e tutti i tipi di strutture stravaganti; Ci sono, tuttavia, due regole:

Nessun dipendenze circolari (due o più migrazioni a seconda di ogni altri) N. verso l'alto le dipendenze nella stessa applicazione (quindi non si può fare 0002_post in app forum dipendono 0003_room nella stessa applicazione, sia direttamente o attraverso una catena di dipendenza.

12

Sud migra le app nell'ordine in cui appaiono nella tupla INSTALLED_APPS in settings.py. Assicurati che App-B venga prima dell'app-A nel tuo settings.py, e dovrebbe funzionare :)

+0

Basta up-votato questo perché questo è in realtà molto importante. '' depends_on' e needed_by' sembra controllare solo le migrazioni attuali. Se sei appena iniziato con le migrazioni, come nel mio caso, South tenterà di caricare i dati iniziali per un'app dopo il completamento della migrazione. non essere disponibile prima di un altro che ne aveva bisogno e si è imbattuto in questioni chiave straniere. Sono stato in grado di risolvere questo problema riordinando le app in "INSTALLED_APPS".South esegue l'app nell'ordine in cui sono in "INSTALLED_APPS" facendo una pausa per eseguire tutte le dipendenze di migrazione esistenti. – jaywhy13

Problemi correlati