web-dev-qa-db-ja.com

Django-複数のユーザープロファイル

最初は、次のようにUserProfileを開始しました。

_from Django.db import models
from Django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    verified = models.BooleanField()
    mobile = models.CharField(max_length=32)

    def __unicode__(self):
        return self.user.email
_

これは、_AUTH_PROFILE_MODULE = 'accounts.UserProfile'_で設定された_settings.py_とうまく連携します。

ただし、私のWebサイトには、個人と企業の2種類のユーザーがいて、それぞれに固有の属性があります。たとえば、個人ユーザーには1人のユーザーだけを持たせて、user = models.OneToOneField(User)を持たせ、企業の場合は、同じプロファイルに関連する複数のユーザーを持たせたいので、user = models.ForeignKey(User)代わりに。

そこで、モデルをIndivProfileCorpProfileの2つの異なるモデルに分離することを考えました。どちらも、モデル固有の属性を関連するサブモデルに移動しながら、UserProfileから継承します。私には良い考えのようで、おそらくうまくいくでしょうが、ユーザーごとに異なる2つのユーザープロファイルがあるため、この方法で_AUTH_PROFILE_MODULE_を指定することはできません。

また、逆に、UserProfileを複数のクラス(モデル)から継承することも考えました。次のようになります。

_class UserProfile(IndivProfile, CorpProfile):
    # some field

    def __unicode__(self):
        return self.user.email
_

このようにして、_AUTH_PROFILE_MODULE = 'accounts.UserProfile'_を設定し、その問題を解決します。しかし、pythonの継承は左から右に機能し、IndivProfileのすべての変数が支配的になるため、これは機能するようには見えません。

確かに、IndivProfile変数とCorpProfile変数がすべて一緒に混合された単一のモデルを常に持つことができ、必要に応じて必要なものを使用します。しかし、それは私にはきれいに見えません。むしろ、それらを分離して、適切な場所で適切なモデルを使用することを望みます。

クリーンこれを行う方法の提案はありますか?

26
Aziz Alfoudari

私はそれをこのようにしました。

PROFILE_TYPES = (
    (u'INDV', 'Individual'),
    (u'CORP', 'Corporate'),
)

# used just to define the relation between User and Profile
class UserProfile(models.Model):
    user = models.ForeignKey(User)
    profile = models.ForeignKey('Profile')
    type = models.CharField(choices=PROFILE_TYPES, max_length=16)

# common fields reside here
class Profile(models.Model):
    verified = models.BooleanField(default=False)

結局、2つの抽象モデル、Djangoですでに定義されているUserと私のProfileモデルの間の関係を反映するために中間テーブルを使用することになりました。共通ではない属性がある場合は、新しいモデルを作成してProfileに関連付けます。

8
Aziz Alfoudari

これは次の方法で実行できます。両方のプロファイルで必要な共通フィールドを含むプロファイルを用意します。そして、クラスUserProfileを作成することでこれをすでに行っています。

class UserProfile(models.Model):
    user = models.ForeignKey(User)
    #some common fields here, which are shared among both corporate and individual profiles

class CorporateUser(models.Model):
    profile = models.ForeignKey(UserProfile)
    #corporate fields here

    class Meta:
        db_table = 'corporate_user'

class IndividualUser(models.Model):
    profile = models.ForeignKey(UserProfile)
    #Individual user fields here

   class Meta:
        db_table = 'individual_user'

ここにはロケット科学は含まれていません。企業プロフィールと個人プロフィールを区別するキーワードを用意するだけです。例えば。ユーザーがサインアップしていると考えてください。次に、ユーザーが企業にサインアップしているかどうかを区別するフィールドをフォームに用意します。そして、そのキーワード(リクエストパラメータ)を使用して、ユーザーをそれぞれのモデルに保存します。

その後、ユーザーのプロファイルが企業または個人であることを確認したい場合は、小さな関数を作成して確認できます。

def is_corporate_profile(profile):
    try:
        profile.corporate_user
        return True
    except:
        return False

#If there is no corporate profile is associated with main profile then it will raise exception and it means its individual profile
#you can use this function as a template function also to use in template
{%if profile|is_corporate_profile %}

これがあなたをどこかに導くことを願っています。ありがとう

24
Aamir Adnan