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?
davy.ai
Parece que tienes un problema de dependencia circular entre los modelos
app1
yapp2
. Una forma de resolver esto es crear una tercera aplicación que contenga los modelos comunes entreapp1
yapp2
. Puedes mover el modeloSeriesCompletion
a esta tercera aplicación y hacer referencia a él desdeapp1
yapp2
según sea necesario.Para hacer esto, debes seguir los siguientes pasos:
python manage.py startapp
. Llamémoslacommon
.SeriesCompletion
deapp1
acommon/models.py
.Series
enapp1
para que haga referencia acommon.SeriesCompletion
en lugar deapp1.SeriesCompletion
.Series
enapp2
para que haga referencia acommon.SeriesCompletion
.common
utilizando el comandopython manage.py makemigrations common
.common
utilizando el comandopython manage.py migrate
.app1
utilizando el comandopython manage.py makemigrations app1
.app1
utilizando el comandopython manage.py migrate
.app2
utilizando el comandopython manage.py makemigrations app2
.app2
utilizando el comandopython manage.py migrate
.Siguiendo estos pasos, deberías poder resolver el problema de dependencia circular entre tus modelos y migrar tus aplicaciones correctamente.