0

私は2つの種類のユーザー(生徒と教師)がいるWebサイトを持っています。クラスベースのビュー(ベストプラクティス)を使用したDjango複数のユーザープロファイル

両方のタイプに共通のログイン機能、年齢、性別などがありますが、学生用のレポートカードやチューター用の学位証明書などの属性が異なります。

私はこの質問をお読みください。Django - Multiple User Profilesとセットアップ私のプロフィールを、以下に示すよう:上記にリンク

class UserProfile(models.Model): 
    user = models.OneToOneField(User, primary_key=True, related_name='profile') 
    mobile = models.CharField(max_length=10, blank=False, null=True) 
    picture = models.ImageField(
     upload_to='images/', default='images/newuser.png') 
    age = models.IntegerField(null=True) 
    slug = models.SlugField() 
    ... 

そして他の二つのモデルを。例:

class StudentProfile(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name="user_profile") 
    #more custom attributes 

class TutorProfile(models.Model): 
    profile = models.ForeignKey(UserProfile, related_name="doctor_profile") 
    #more custom attributes 

は今私の質問:

1)SlugFieldUserProfile属性に定義されていますが、理想的にUser.usernameフィールドを使用します。これは、これらの2つのテーブル間の結合が毎回発生することを意味します。これは期待されていますか?

2)クラスベースのビューを使用していると仮定すると、プロファイルの編集/表示は問題のUserProfileによって異なります。しかし、私はユーザーが同じページ上の彼のすべての詳細を編集/表示できるようにしたい。したがって、TutorProfile/StudentProfileも取得し、カスタムロジックを追加して更新が確実に行われるようにする必要があります。

これらの状況を処理する適切な方法があるはずです(多くのWebサイトには同様の要件があるため)。このような状況では、ベストプラクティスはどのようなものですか?

+0

これに代わる実装をしている人はいますか? – sudshekhar

+0

私は何かを思いついたら、私は答えを投稿します。 –

答えて

1

答えを探しているうちに、自分のニーズに合った解決策を見つけました(批評を歓迎し、回答を探している他の人を助けるためにここに投稿します)。 Django Design patterns and Best Practices

class UserProfile(models.Model): 
    user = models.OneToOneField(User, primary_key=True, related_name='profile') 
    mobile = models.CharField(max_length=10, blank=False, null=True) 
    picture = models.ImageField(
     upload_to='images/', default='images/newuser.png') 
    age = models.IntegerField(null=True) 
    gender = models.IntegerField(null=True) 
    user_type = models.CharField(max_length=20, choices=UserTypes.CHOICES) 
    slg = models.SlugField()  

    class Meta(object): 
     abstract = True 


class StudentProfile(models.Model): 
    report_card = models.FileField(upload_to="/temp") 
    house = models.CharField() 

    class Meta(object): 
     abstract = True 


class TutorProfile(models.Model): 
    performance = models.IntegerField(default=0) 
    salary = models.IntegerField(default=0) 

    class Meta(object): 
     abstract = True 

一つの基本抽象クラスと様々なユーザプロファイルをカバーする2つの特定のクラスから撮影

。このようにそれらを分けておくことで、各ユーザータイプに存在するさまざまなフィールドについて簡単に推論することができます。 最後に、

class Profile(UserProfile, StudentProfile, TutorProfile): 
    pass 

これはsettings.AUTH_USER_MODELとして使用されるモデルです。

全体的に、私が見利点:ユーザーedit/viewページの

  1. シングルDBコール。
  2. 全体的に考えるのは簡単です。

短所:多くの無駄なスペース。

誰でも良い提案がありますか?

関連する問題