2017-10-23 2 views
0

deklariert Ich habe eine ziemlich komplexe Projektarchitektur, die mehrere Anwendungen enthält, deren Modelle Querverweise enthält.Django Migrations ValueError: [...] wurde mit einem verzögerten Verweis auf [...]

Zum Beispiel, ich habe ein billing.Premium Modell - die zum billing App gehört -, dass von einem anderen Modell, dessen Namen verwiesen wird, ist payments.PaymentJob durch einen 00.59 Feld:

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

(Dieser Code kommt von einem payment ‚s-Migrationen)

Aber ich habe bis zu einem gewissen Punkt kommen, wenn ich billing.Premium-billing.PremiumInstallment umbenennen müssen, und das ist, wenn der lustige Teil kommt: nach meinem Co Refactoring haben de die Modellnamen zu ersetzen, ich versuche zu django-admin makemigrations, es führt zu dem folgenden Fehler:

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

Es scheint wie meine Migration gebrochen wurde, da ich das Modell von einer externen Anwendung umbenannt habe. Ich weiß nicht, wie ich das auf eine raffinierte Art und Weise beheben kann, ich meine, dass eine Migration ohne Fehler erzeugt wird, und das würde angewendet werden, wenn ich django-admin migrate ausführen würde.

Irgendeine Idee?

+0

Ich bin nicht so erfahren mit Django Modellierung schaffen sollte, sondern von der Der Fehler ist klar, dass Sie das Modell umbenannt haben, auf das von einem anderen verwiesen wird, und dann werden die geänderten nicht migriert, da der Verweis nicht mehr gefunden wird. Werfen Sie einen Blick darauf, da von Ihrem Fehler könnte richtige Schritte auf nicht einfache Architektur https://stackoverflow.com/questions/25091130/django-migration-strategy-for-renaming-a-model-and-relationshipfields gelöst werden –

+0

Ich habe, aber alle Modelle sind in der gleichen App, wo ich zwei Modelle in zwei getrennten Apps habe, und ich kann nicht richtig durch die beschriebene Methode refaktorieren ... –

Antwort

0

Nach dem docs für den RenameModel Betrieb

You may have to manually add this if you change the model’s name and quite a few of its fields at once; to the autodetector, this will look like you deleted a model with the old name and added a new one with a different name, and the migration it creates will lose any data in the old table.

Sie manuell eine Migration und fügen Sie den RenameModel Betrieb es

class Migration(migrations.Migration): 

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

    operations = [ 
     migrations.RenameModel('Premium', 'PremiumInstallment') 
    ] 
+0

Muss ich die andere Migration zu zeigen auf ' Billing.PremiumInstallment' statt 'billing.Premium' dann? Denn jetzt ist die Migration etwas fehlerhaft, da sie auf ein Modell verweist, das nicht mehr existiert. –

+0

Ich glaube, Sie überprüfen alle Modelle, die von der umbenannten Version abhängen –

+0

Ein interessanter Punkt - um sicherzustellen, dass Ihre manuelle Migration ALLE MODELLÄNDERUNGEN berücksichtigt, führen Sie nach dem Erstellen und Speichern Ihrer benutzerdefinierten Migrationsdatei 'python manage aus .py Makemigrationen. Dadurch wird eine Migration mit allen Änderungen vorgenommen, die von Ihrer benutzerdefinierten Migration nicht berücksichtigt wurden. Gut für die Buchhaltung und Doppelprüfung. –

Verwandte Themen