2016-06-11 1 views
3

djangoのマイグレーションを作成する際には、モデルをインポートして使用するのではなく、apps.get_model()を使用する必要があります。データ移行を行うのはなぜデータ移行の作成時にapps.get_model()を使用する理由は何ですか?

ではなく、最新の1以上のモデルの歴史的なバージョンを使用する必要がありますか?(モデルの履歴バージョンはとにかく右使用されていないのだろうか?)

答えて

7

それはの履歴バージョンを使用しています他のデータベースに対してマイグレーションを実行したときに、コードベースに存在しなくなったフィールドにアクセスしようとしても問題は発生しません。

モデルからいくつかのフィールドを削除し、新しいデータベースでマイグレーションを実行していて、モデルを直接インポートしていた場合は、マイグレーションが存在しないフィールドを使用しようとすると不平を言います。 apps.get_model(...)を使用する場合、Djangoはマイグレーションファイルのmigrations.AddField(...)の定義を使用して、その時点で正しいバージョンのモデルを提供します。

これはDjangoがマイグレーション履歴からこれらのメソッドを再作成できるとは考えていないため、カスタムモデル/モデルマネージャメソッドをデータマイグレーションで使用する際に注意が必要だと言います。移行は一貫していません。

+0

私はモデル内のフィールドを削除した場合、私は私の移行が唯一の削除、フィールド上に存在しない存在し、フィールドに注力したいと思います。だから、私が存在しないフィールドを使用しようとしているとジャンゴが文句を言うとき、それは正しいとジャンゴが期待したいのですか? – user3282666

+0

Djangoは6ヶ月前に書かれたデータ移行に関して、モデルが全く違っていたことについて話しているかもしれませんが、6ヶ月前と同じようにデータ移行は今でも同じように動作する必要があります。データ移行は現在のモデル用に設計されておらず、モデルの特定のバージョン用に設計されているため、現在のモデルでフィールドが欠落していると不平を言ってはいけません。 – ARJMP

+0

ありがとう!だから私はこのシナリオを考えることができなかったばかげた – user3282666

0

は、このモデルを考えてみましょう:

class A(models.Model): 
    field1 = models.PositiveIntegerField() 
    field2 = models.PositiveIntegerField() 

はあなたの移行の歴史は、これらの二つのフィールドを知っていて、それ以上の移行は、このモデルの状態を考慮し、このモデルの状態への変更を行います。

今、あなたはフィールド1とあなたのモデルとなり削除するとします。

class A(models.Model): 
    field2 = models.PositiveIntegerField() 

そして、あなたの移行では、あなたがフィールド1を使用しようと、Djangoはそのフィールド1が存在していた知っている必要があります。したがって、apps.get_model()を使用すると、djangoは以前の移行履歴を使用してfield1を推論するのに役立ちます。それ以外の場合はエラーが発生します。

(編集:答えにタイプミスを修正)

関連する問題