2016-05-12 2 views
1

nullableフィールドをnull値に設定できないように変更しています。新しい__init__ルーチンは、適切なデフォルトを思い付くためにいくつかのカスタムの指輪を使ってフィールドがヌルになることを保証します。保存されたインスタンスを取得するときにORMがinitを呼び出しますか?

問題は、デフォルトの新しいルールを適用するために既存のデータを移行することが不可欠かどうか、またはレガシーオブジェクトが取得されるたびにこれらのルールが自動的に適用されるかどうかです。

Reading the source私は、ORMが保存されたデータのピクルスを復元したと思われるので、すべての古いレコードを更新する必要があります。しかし、もう一組の目が必要です。

保存されたインスタンスを取得するときにORMがinitを呼び出しますか?

+0

私はあなたに答えがありませんが、何か似たようなことをする必要があるたびに、まずモデルファイルを更新してから、MySQL WorkbenchなどでDBを手動で更新します。何らかの理由で、私はちょうどDjangoをこれらの種類のものになると信じていません。ちょうど私の0.02。 – WayBehind

+1

[docs](https://docs.djangoproject.com/en/1.9/ref/models/instances/#django.db.models.Model)は '__init __()'をオーバーライドしないことをお勧めします。フィールドをnot-nullableに変更すると、移行後に新しい制約に違反しないように古いデータを変更する必要があります。 – knbk

答えて

1

__init__は、モデルインスタンスを作成するときにモデルで呼び出されますか?短い答えは「はい」です。 getを使用する場合、またはクエリーセットをスライスするか、それを反復する場合は、__init__が呼び出されます。

MyModel.objects.get(pk=1) 
MyModel.objects.all()[2] 
for p in MyModel.objects.all(): 
    print p.pk 

しかし__init__をオーバーライドすると、モデルのロード動作を制御するための推奨方法ではありません。すなわちfrom_db()メソッドは、データベースからロードするときにモデルインスタンス作成 をカスタマイズするために使用することができるfrom_db

で行われるべきです。

デシベル引数はモデル からロードされたデータベースのデータベース別名が含まれている、FIELD_NAMESがロードされているすべてのフィールドの名前が含まれ、 と値がFIELD_NAMES内の各フィールドのロードされた値が含まれています。

+0

確認済み:initの中にプリントを貼り付け、インスタンスを作成して保存しました。その後、 'get'を使用してそれを検索すると、実際には「I AM INIT」が2度目に印刷されます。 –

関連する問題