es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Migración de Django: Revertir o omitir “ValueError: Dependencia en la aplicación sin migraciones”.

Mientras intentaba separar los modelos en diferentes aplicaciones, me encontré con un problema en el que necesitaría soporte:

Tengo 2 modelos:

class SeriesCompletion(models.Model):
   series = models.ForeignKey(
       'Series', blank=True, null=True, on_delete=models.SET_NULL)
   user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True,
                         null=True, on_delete=models.SET_NULL)

y

class Series(models.Model):
   ...
   users_who_completed = models.ManyToManyField(
     settings.AUTH_USER_MODEL, through='app1.SeriesCompletion')

ambos se encuentran en la aplicación app1.

La idea (que funcionó bien en el entorno de desarrollo) era hacer un dumpdata, mover SeriesCompletion a app2 y hacer las migraciones, luego hacer un loaddata para repoblar correctamente.

Sin embargo, cuando pasé al entorno de producción, ejecuté la migración de app1 con el modelo Series con una referencia a app2:

class Series(models.Model):
   ...
   users_who_completed = models.ManyToManyField(
     settings.AUTH_USER_MODEL, through='app2.SeriesCompletion')

Pasó en producción, pero al hacer la migración para app2, se bloqueó debido a una referencia circular: ValueError: <function></function><locals>.resolve_through_model at 0x7f3e531f4400> contiene una referencia perezosa a app2.seriescompletion, pero no está instalada la aplicación 'app2'.

He intentado muchas cosas desde entonces, pero siempre quedo bloqueado y no puedo realizar una migración para app1 ni para app2… o retroceder volviendo a la migración anterior con app1. Siempre termino durante las comprobaciones previas a la migración con el mensaje de error:

ValueError: Dependencia en una aplicación sin migraciones

¿Alguna idea brillante para ayudarme a salir de este lío?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que tienes un problema de dependencia circular entre los modelos app1 y app2. Una forma de resolver esto es crear una tercera aplicación que contenga los modelos comunes entre app1 y app2. Puedes mover el modelo SeriesCompletion a esta tercera aplicación y hacer referencia a él desde app1 y app2 según sea necesario.

    Para hacer esto, debes seguir los siguientes pasos:

    1. Crea una nueva aplicación de Django utilizando el comando python manage.py startapp. Llamémosla common.
    2. Mueve el modelo SeriesCompletion de app1 a common/models.py.
    3. Actualiza el modelo Series en app1 para que haga referencia a common.SeriesCompletion en lugar de app1.SeriesCompletion.
    4. Actualiza el modelo Series en app2 para que haga referencia a common.SeriesCompletion.
    5. Crea una nueva migración para common utilizando el comando python manage.py makemigrations common.
    6. Aplica la migración para common utilizando el comando python manage.py migrate.
    7. Crea una nueva migración para app1 utilizando el comando python manage.py makemigrations app1.
    8. Aplica la migración para app1 utilizando el comando python manage.py migrate.
    9. Crea una nueva migración para app2 utilizando el comando python manage.py makemigrations app2.
    10. Aplica la migración para app2 utilizando el comando python manage.py migrate.

    Siguiendo estos pasos, deberías poder resolver el problema de dependencia circular entre tus modelos y migrar tus aplicaciones correctamente.

Comments are closed.