/ / Django Migrations ValueError: [...] è stato dichiarato con un riferimento lazy a [...] - python, django, django-migrations

Django Migrations ValueError: [...] è stato dichiarato con un riferimento lazy a [...] - python, django, django-migrations

Ho un'architettura di progetto piuttosto complessa che coinvolge diverse applicazioni i cui modelli contengono riferimenti incrociati.

Ad esempio, ho un billing.Premium modello - che appartiene al billing app - a cui fa riferimento un altro modello il cui nome è payments.PaymentJob attraverso a campo da uno a uno:

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

(Questo codice proviene da uno di payment"migrazioni")

Ma sono giunto ad un punto in cui ho bisogno di rinominare billing.Premium a billing.PremiumInstallment e questo è quando arriva la parte divertente: dopo aver rifatto il mio codice per sostituire il nome del modello, cerco di farlo django-admin makemigrations, porta al seguente errore:

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

Sembra che la mia migrazione sia stata interrottada quando ho rinominato il modello di un'applicazione esterna. Non so come risolvere questo problema in modo carino, voglio dire generare qualche migrazione senza errori e che sarebbe applicata quando corro django-admin migrate.

Qualche idea?

risposte:

0 per risposta № 1

Secondo il docs per il RenameModel operazione

Potrebbe essere necessario aggiungerlo manualmente se si modificail nome del modello e alcuni dei suoi campi contemporaneamente; all'autodetector, sembrerà che tu abbia cancellato un modello con il vecchio nome e ne abbia aggiunto uno nuovo con un nome diverso, e la migrazione creata perderà tutti i dati nella vecchia tabella.

Dovresti creare manualmente una migrazione e aggiungere il RenameModel operazione ad esso

class Migration(migrations.Migration):

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

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