最初は、次のように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)
代わりに。
そこで、モデルをIndivProfile
とCorpProfile
の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
変数がすべて一緒に混合された単一のモデルを常に持つことができ、必要に応じて必要なものを使用します。しかし、それは私にはきれいに見えません。むしろ、それらを分離して、適切な場所で適切なモデルを使用することを望みます。
クリーンこれを行う方法の提案はありますか?
私はそれをこのようにしました。
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
に関連付けます。
これは次の方法で実行できます。両方のプロファイルで必要な共通フィールドを含むプロファイルを用意します。そして、クラス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 %}
これがあなたをどこかに導くことを願っています。ありがとう