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