Django 1.5およびカスタムユーザーモデルの導入により、_AUTH_PROFILE_MODULE
_は非推奨になりました。既存のDjangoアプリケーションでは、User
モデルを使用し、私もProfile
への外部キーを持つUser
モデルがあり、ユーザーに関するその他の情報をプロファイルに格納します。現在_AUTH_PROFILE_MODULE
_を使用しており、これは「app.profile」に設定されています。
明らかに、私のコードは多くのuser.get_profile()
を実行する傾向があり、これをなくす必要があります。
これで、新しいカスタムユーザーモデルを作成できます(プロファイルモデルをUser
に拡張するだけです)が、現在ユーザーへの外部キーを持っている他のすべての場所でも変更する必要があります...したがって、これは私のライブサービスでの大規模な移行。
モデルを移行せずに、どこかでget_profile()
)のようなものでmy_user.userprofile_set.all()[0]
関数を作成/オーバーライドする方法はありますか?
この道を進み、アイデアや経験を共有できる人はいますか?
もし私が今このサービスをどこでやり直すのか-明らかにこのようには行かないでしょうが、中規模のライブプロダクションシステムで私はショートカットを開いています:-)
組み込みのUser
に関連するプロファイルモデルを使用することは、追加のユーザー情報を格納するための完全に正当な構成です(多くの場合推奨されます)。組み込みのDjango 1対1の構文がここでクリーンかつエレガントに機能することを考えると、現在非推奨になっているAUTH_PROFILE_MODULE
およびget_profile()
のものは不要になりました。
すでに使用している場合、古い使用法からの移行は実際には簡単ですプロファイルモデルでOneToOneField
から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
の構文上の魔法に慣れていない場合は、 here を参照してください。最終的には、get_profile()
をprofile
またはrelated_name
に置き換えるだけで済みます(上記の場合の自動関連名はuser_profile
になります)。標準Django逆1-1構文は実際にはget_profile()
よりも優れています!
しかし、これではあなたの質問に完全に答えることはできないと思います。プロファイルモジュールでForeignKey
ではなくUser
からOneToOne
を使用したことを示していますが、これは問題ありませんが、フォローアップコメントに記載されているように、ForeignKey
のままにしておくと構文は単純ではありません。
実際にはForeignKey
を一意の外部キー(基本的に1対1)として使用していると仮定すると、 DB内のOneToOneField
は、unique=True
制約のあるForeignKey
フィールドにすぎません。 、コード内でForeignKey
フィールドをOneToOneField
に変更できます。実際にデータベースを大幅に移行したり、データを失ったりする必要はありません。
移行にSouthを使用している場合、前のセクションからのコード変更により、Southが古いフィールドを削除して作成するのを混乱させる可能性があります。 schemamigration --auto
を実行する場合は新しいものなので、正しく実行するには移行を手動で編集する必要がある場合があります。 1つのアプローチは、スキーママイグレーションを作成してから、forwardsメソッドとbackwardsメソッドを空白にして、実際には何も実行しようとしないようにすることですが、それでもモデルをOneToOneField
として適切にフリーズします。次に、物事を完璧に実行したい場合は、対応するデータベースの外部キー列にも一意性制約を追加する必要があります。これは、SQLを使用して手動で行うか、Southを介して行うことができます(移行方法を手動で編集するか、ForeignKey
にunique=True
を設定し、最初のSouth移行を作成してから、OneToOneField
に切り替えて、2番目の移行を行い、フォワード/バックワードメソッド)。