/ / Django Migrations ValueError: […] a été déclaré avec une référence paresseuse à […] - python, django, django-migrations

Django Migrations ValueError: […] a été déclaré avec une référence paresseuse à […] - python, django, django-migrations

J'ai une architecture de projet assez complexe qui implique plusieurs applications dont les modèles contiennent des références croisées.

Par exemple, j'ai un billing.Premium modèle - qui appartient à la billing app - qui est référencé par un autre modèle dont le nom est payments.PaymentJob à travers un un à un champ:

("premium", models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to="billing.Premium", verbose_name="premium"))

(Ce code provient d'un des payment"migrations)

Mais je suis arrivé à un moment où je dois renommer billing.Premium à billing.PremiumInstallment et c’est là que vient la partie amusante: après avoir refactoré mon code pour remplacer le nom du modèle, j’essaie de django-admin makemigrations, cela conduit à l'erreur suivante:

ValueError: The field payments.PaymentJob.premium was declared with a lazy reference to "billing.premium", but app "billing" doesn"t provide model "premium".

Il semble que ma migration a été interrompuedepuis que j'ai renommé le modèle d'une application externe. Je ne sais pas comment résoudre ce problème de façon élégante, je veux dire générer une migration sans erreur et cela serait appliqué lorsque je lance django-admin migrate.

Une idée?

Réponses:

0 pour la réponse № 1

Selon le docs pour le RenameModel opération

Vous devrez peut-être ajouter ceci manuellement si vous changezle nom du modèle et plusieurs de ses champs à la fois; Pour le détecteur automatique, cela ressemblera à celui que vous avez supprimé un modèle avec l'ancien nom et ajouté un nouveau avec un nom différent, et la migration qu'il crée perdra toutes les données de l'ancienne table.

Vous devez créer manuellement une migration et ajouter le RenameModel opération à elle

class Migration(migrations.Migration):

dependencies = [
("billing", "xxxx_previous_migration"),
]

operations = [
migrations.RenameModel("Premium", "PremiumInstallment")
]