私のDjangoモデルには、2つのフィールドname
(通常のCharField
)とslug
、フィールド定義で渡されたフィールド名に基づいてスラッグを生成するカスタムフィールドがあります。この場合はこれを使用name
します。
まず、モデルにはname
フィールドのみがあり、対応する移行とすべてが含まれていました。次に、slug
フィールドを追加する必要があったので、南の規則に従って、でスラッグフィールドを追加しunique=False
、スキーマ移行を作成してから、データ移行unique=True
を作成し、この最後の変更に対してを設定して、別の移行を作成しました。
スラッグの値はモデルの保存時に生成されるため、データ移行のメソッドで行ったのは、各インスタンスでforwards
返されたクエリセットを繰り返し処理しorm['myapp.MyModel'].objects.all()
、メソッドを呼び出すことでした。save()
ただし、スラッグフィールドの値は生成されません。IPythonセッションでは、同じことを行いましたが、モデルをとして参照しfrom myapp.models import MyModel
、機能しました。いくつかのデバッグステートメントを使用してtype
、Southのorm dictによって返されたモデルのを出力すると、実際のクラスが表示されます。これは、Southによってオンザフライで構築された偽のモデルではないようです。
slugフィールドは、pre_save
メソッドのときにその値を作成します。データ移行中に強制的に呼び出されるようにするにはどうすればよいですか?後のスキーマ移行でインデックスが適用されるときに、列に重複する値が含まれないように、値の一意性を確認する必要があります。
ありがとう!
ところで:スラッグフィールドクラスは定義しているsouth_field_triple
ので、サウスはそれでうまく機能します。
編集:私の答えを見てください。しかし、答えのように、それはハックのように感じます。これを行うためのより良い/正しい方法はありますか?