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 № 1Selon 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")
]