14

企業、管理者、外部の人々など、さまざまな種類のユーザーを許可するDjangoアプリケーションがあります。もちろん、これらはすべて、デフォルトの認証システムとグループで簡単に管理できます。

私の問題は、さまざまなグループに属するユーザーがさまざまな関連情報を持っていることです。たとえば、企業は個人ユーザーには意味のない商用情報を提供する必要があります。したがって、グループに応じて、さまざまな種類のプロファイルを添付する必要があります。(私のアプリケーション グループでは、相互に排他的です。)

残念ながら、Django ではプロファイルとしてアタッチできるモデルは 1 つだけであり、そのモデルは で宣言されていsettings.AUTH_PROFILE_MODULEます。内部的には、User.get_profile()メソッドによって取得されます。メソッドは基本的にこの値を読み取り、モデルが実際に存在するかどうかなど、いくつかのチェックを実行します。

グループに応じて異なるモデルを返すように、メソッドをサブクラス化Userしてオーバーライドすることを考えていました。get_profile()

さまざまな種類のプロファイルを管理するための、よりシンプルでクリーンな方法はありますか?

User のサブクラス化を避けるためにユーザー プロファイルが導入されたことを考えると、私が提案していることはちょっとしたハックのように思えます。

4

1 に答える 1

17

OneToOneFieldtoUserと。を使用してモデルを作成しますrelated_name

例:

class Firm(models.Model):
    user = models.OneToOneField(User, related_name='firm')
    # other fields

class External(models.Model):
    user = models.OneToOneField(User, related_name='external')
    # other fields

user次に、 ( )でこの属性の存在を確認し、if hasattr(request.user, 'firm')適切なインスタンスを返すことができます。request.user_profileたとえば、カスタムミドルウェアに入れます。

于 2011-07-12T11:00:53.833 に答える