2016-03-27 11 views
0

私はDjangoプロジェクトに取り組んでいます。ユーザーには2種類あります。最初のタイプ - 顧客(UserProfile)はUserの拡張ビルトインです。電話アドレスなどが格納されている必要があります。Translatorという別のタイプのUserがあります。Djangoで2レベルのユーザー拡張

class UserProfile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='userprofile') 
    telephone = models.CharField(max_length=40,null=True) 
    ... 

、私は:私はUserProfileを処理するために、おそらく最も一般的な方法を選択したなど

LanguagesPrices - 翻訳者は、すべての権限を持ち、顧客(のUserProfile)などの属性と、いくつかの新しい属性Customerのプロフィールを作成します。 User(すべてのユーザーはすでにUserProfileです)を拡張するか、UserProfileを拡張するかどうかは決めることができません。

だから、オプションAは次のとおりです。

class TranslatorUserProfile(models.Model): 
    user_profile = models.OneToOneField(User) 
    languages ... 
    ... 

とオプションBは次のとおりです。

class TranslatorUserProfile(models.Model): 
    user_profile = models.OneToOneField(UserProfile) 
    languages ... 
    ... 

翻訳は、より多くのページにアクセスすることができますUserProfileで、もちろんそれ以上になりますどのUser定期属性。

パターンはありますか?私は何をすべきか?

+0

複数のユーザータイプではなく、グループを使用してカスタムのアクセス許可を設定することについて考えましたか? –

答えて

0

論理的には、翻訳者は共通のユーザーを拡張します。別の両方のDBテーブルを保つために、あなたは両方が彼らの共通の属性を定義する抽象ベースモデルをサブクラス化することができます:

class AbstractUserProfile(models.Model): 
    user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='%(class)s') 
    telephone = models.CharField(max_length=40,null=True) 
    ... 

    class Meta: 
      abstract = True 

class UserProfile(AbstractUserProfile): 
    pass 

class TranslatorUserProfile(AbstractUserProfile): 
    languages = ... 

私は仕事でのプロジェクトで正常に動作し、このような構造を有しています。

+0

ありがとうございます。ユーザーが翻訳者になりたい場合はどうすればよいですか?この場合、UserProfileに基づいてTranslatorUserProfileを作成してから、UserProfileを削除する必要がありますか? –

+0

ええ、これはおそらくその場合に行く方法です。 – schwobaseggl

関連する問題