2017-10-23 8 views
0

モデルが相互参照を含むいくつかのアプリケーションを含む非常に複雑なプロジェクトアーキテクチャを持っています。Django Migrations ValueError:[...]は、[...]への怠惰な参照で宣言されました

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

(このコードが来る: - billingアプリに属している - その名を一つのフィールドに1を通じてpayments.PaymentJobある別のモデルによって参照される

例えば、私はbilling.Premiumモデルを持っていますpaymentの移行)

しかし、私は、私はbilling.PremiumInstallmentからbilling.Premiumの名前を変更する必要があると面白い部分が来るとき、これはいくつかのポイントになってきたのいずれかから:私の協力をリファクタリングした後、

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

私の移行が破損しているように私は、外部アプリケーションのモデルの名前を変更したので、それが表示されます:・デ・モデル名を置き換えるために、私はそれが次のエラーにつながる、django-admin makemigrationsにしてみてください。私はこの方法を奇妙な方法で修正する方法がわかりません。エラーなしで移行を生成することを意味し、それはdjango-admin migrateを実行したときに適用されます。

+0

、しかしから別のモデルで参照されているモデルの名前を変更した後でエラーが解消され、参照がもう見つからないため、変更されたモデルが移行されません。あなたのエラーから、単純なアーキテクチャではなく、正しい手順を実行することができますので、これを見てください。https://stackoverflow.com/questions/25091130/django-migration-strategy-for-renaming-a-model-and-relationship-fields –

+0

私はそうしましたが、すべてのモデルが同じアプリケーション内にあります。私は2つの分離されたアプリケーションで2つのモデルを持っています。私は記述された方法でリファクタリングすることはできません... –

答えて

0

手動移行を作成し、それにRenameModel操作を追加する必要があります

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.

RenameModel操作のためのdocsによる

私はDjangoのモデルで経験していないのです
class Migration(migrations.Migration): 

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

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

他の移行を編集して、それでは、請求書ではなくプレミアム・インシュレーションです。これは、もはや存在しないモデルを指しているので、今やマイグレーションは一種のバグだからです。 –

+0

名前を変更したものに依存するすべてのモデルをチェックすることをお勧めします。 –

+0

興味深い点 - 手動マイグレーションがすべてのモデル変更の原因となっていることを確認するには、カスタムマイグレーションファイルを作成して保存した後、 'python manage .py makemigrations'です。これにより、カスタム・マイグレーションでは考慮しなかったすべての変更がマイグレーションされます。簿記と二重チェックに適しています。 –

関連する問題