2011-09-19 14 views
8

Recientemente comencé a usar South para migraciones en mi proyecto Django. Todo iba bien hasta hace poco cuando me encontré con un problema peculiar.¿Qué orden de migración sigue South en diferentes aplicaciones?

Tengo dos aplicaciones en mi proyecto, por ejemplo, App-A y App-B. Un modelo en App-A tiene una clave externa para un modelo en App-B. Cuando he estado tratando de construir mi sistema, ejecuté syndb que creó todas las tablas auth_ y south_. Luego ejecuté migrate que arrojó errores. Cuando intentó crear el modelo de la aplicación A, que hacía referencia a un modelo de la aplicación B, el modelo de la aplicación B no se migró/creó aún y, por lo tanto, el error.

Para resolver esto, tuve que migrar manualmente la aplicación B primero y luego la aplicación A. ¿Estoy haciendo algo mal aquí? ¿Cómo se supone que South debe conocer el orden de migración en todas las aplicaciones?

Gracias.

Respuesta

16

Esto lo explicó https://south.readthedocs.io/en/latest/dependencies.html.

migraciones de aplicaciones son agradables 'n de todo, pero al comenzar a escribir un gran proyecto , con una gran cantidad de aplicaciones, se da cuenta que tiene extranjeras clave relaciones entre las aplicaciones y la elaboración de lo migraciones orden sería necesidad para aplicar en cada aplicación es simplemente doloroso.

Afortunadamente, también tuvimos este problema, por lo que South tiene un sistema de dependencia. Dentro de una migración, puede declarar que depende de que otra aplicación haya ejecutado una determinada migración primero; por ejemplo, si mi aplicación “foro” depende de las “cuentas” de la aplicación después de haber creado su perfil de usuario tabla, podemos hacer:

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

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

    def forwards(self): 

Entonces, si usted trata de migrar o más allá de 0002_post en el foro aplicación, primero se asegurará de que las cuentas se migren al menos al hasta 0003_add_user_profile, y si no, lo migrará por usted.

Dependencias también funcionan a la inversa; South sabe que no se debe deshacer la migración 0003_add_user_profile hasta que haya deshecho la migración 0002_post .

Puede tener múltiples dependencias y todo tipo de estructuras extravagantes; Hay, sin embargo, dos reglas:

No hay dependencias circulares (dos o más migraciones dependiendo de cada otros) no hacia arriba dependencias en la misma aplicación (por lo que no puede hacer 0002_post en el foro aplicación dependen de 0003_room en la misma aplicación, ya sea directamente oa través de una cadena de dependencia.

12

South migra las aplicaciones en el orden en que aparecen en la tupla INSTALLED_APPS en settings.py. Así que solo asegúrese de que App-B venga antes que App-A en su settings.py, y debería funcionar :)

+0

Justo arriba-votó esto porque esto es realmente muy importante. '' depends_on' y needed_by' parece controlar solamente las migraciones actuales. Si eres Comenzando con las migraciones, como mi caso, South intentará cargar los datos iniciales de una aplicación una vez que se complete la migración. Me encontré con problemas de da no estaba disponible antes que otro que lo necesitaba y se encontró con problemas de clave externa. Pude resolver esto reordenando las aplicaciones en 'INSTALLED_APPS'.South ejecuta la aplicación en el orden en que están en 'INSTALLED_APPS' haciendo una pausa para ejecutar las dependencias de migración que haya. – jaywhy13

Cuestiones relacionadas