Django 1.6 への移行で get_profile() を削除する 質問する

Django 1.6 への移行で get_profile() を削除する 質問する

Django 1.5 とカスタム ユーザー モデルの導入により、 はAUTH_PROFILE_MODULE非推奨になりました。既存の Django アプリケーションでは、 モデルを使用しており、への外部キーを持つモデルUserも使用して、ユーザーに関するその他の情報をプロファイルに保存しています。現在 を使用し、これは 'app.profile' に設定されています。したがって、明らかに、私のコードは を大量に実行する傾向があり、これを今すぐ削除する必要があります。ProfileUserAUTH_PROFILE_MODULE
user.get_profile()

これで、新しいカスタム ユーザー モデルを作成できます (プロファイル モデルを拡張するだけですUser)。ただし、現在ユーザーへの外部キーがある他のすべての場所も変更する必要があります... そのため、これはライブ サービスでの大規模な移行になります。

モデルの移行を行わずに、どこかに )get_profile()のようなもので関数を作成/オーバーライドする方法はありますかmy_user.userprofile_set.all()[0]?

この道を歩んだことのある方、アイデアや経験を共有できる方はいらっしゃいますか?

もし今このサービスをもう一度行うとしたら、もちろんこの方法はとらないでしょうが、中規模ライブ制作システムではショートカットは可能です :-)

ベストアンサー1

組み込みの との関係を持つプロファイル モデルを使用することは、User追加のユーザー情報を保存するための完全に正当な構成であり、多くの場合推奨されます。組み込みの Django 1 対 1 構文がここではクリーンかつエレガントに機能することを考えると、現在非推奨となっているAUTH_PROFILE_MODULEおよびget_profile()は不要になりました。

すでに使用しているのであれば、古い使用法からの移行は実際には簡単です。プロフィールモデルにOneToOneFieldtoを使用するUser、それがget_profile が非推奨になる前に、プロファイルモジュールを設定することが推奨されていました。

class UserProfile(models.Model):
    user = OneToOneField(User, related_name="profile")
    # add profile fields here, e.g.,
    nickname = CharField(...)

# usage: no get_profile() needed. Just standard 1-to-1 reverse syntax!
nickname = request.user.profile.nickname  

見るこここれを可能にするの構文マジックに詳しくないなら、 を参照してくださいOneToOneField。 最終的には、 または の単純な検索と置換になりますget_profile()(profile上記related_nameのケースで自動で関連付けられる名前は になりますuser_profile)。 標準の Django 逆 1-1 構文は、 よりも実際は優れていますget_profile()

ForeignKey を OneToOneField に変更する

しかし、これではあなたの質問に完全には答えられないことに気付きました。プロファイルモジュールで ではなくForeignKeyを使用したとおっしゃっていますが、それは問題ありません。しかし、フォローアップコメントで指摘されているように、 のままにしておくと構文がそれほど単純ではありません。実際に を一意の外部キー(基本的に1対1)として使用していたと仮定すると、UserOneToOneForeignKey
ForeignKeyDBではaは制約のあるOneToOneField単なるフィールドであるForeignKeyunique=True、あなたはできるはずですフィールドForeignKeyOneToOneField実際に大規模なデータベース移行を行ったり、データ損失が発生したりすることなく、コード内で実行できます。

南への移住への対応

使用している場合移行の場合、前のセクションのコード変更により、 を実行すると South が古いフィールドを削除して新しいフィールドを作成するように混乱する可能性があるschemamigration --autoため、移行を手動で編集して正しく実行する必要がある場合があります。 1 つの方法は、スキーマ移行を作成し、forward メソッドと backwards メソッドを空白にして、実際には何も実行しないようにしながらも、モデルを前方に向かって適切に固定することですOneToOneField。 次に、完璧に実行したい場合は、対応するデータベースの外部キー列にも一意の制約を追加する必要があります。 これは、SQL を使用して手動で行うことも、 South を介して行うこともできます (移行メソッドを手動で編集するか、 をunique=TrueオンForeignKeyにして最初の South 移行を作成してから に切り替えてOneToOneField2 番目の移行を実行し、forward/backwards メソッドを空白にします)。

おすすめ記事