6

注:バージョン 1.5 以降の Django のユーザー モデルの更新を考慮して、この質問を再度行いました。

既存の Django サイトを再構築して改善し、Webfaction から Heroku に、Amazon の SimpleDB から Heroku Postgres に移行しています (ただし、開発時に Sqllite3 でローカルにテストしています)。私がやっていることの多くは、Django admin、ユーザー認証などの組み込みの Django 機能を使用するように移行しています。

概念的には、このサイトには学生と企業の 2 種類のユーザーがいます。2 種類のユーザーには、完全に異なるアクセス許可と、ユーザーに関する情報が保存されています。これは非常によくあることで、サイトの元の構造では、データ モデルを次のように設定しました。

Users
    ID (primary_key)
    Business_or_Student ('B' if business, 'S' if student)
    email (unique)
    password (hashed, obviously)
    ...

Students
    ID (Foreignkey on Users)
    <more information>
    ...

Businesses
    ID (Foreignkey on Users)
    <more information>
    ...

これは非常にうまく機能し、必要最小限のユーザー情報を Users テーブルに格納し、さらに詳細な情報を Student テーブルと Businesses テーブルに格納しました。ユーザーの完全なプロファイルを取得するには、次の疑似コードに沿った何かが必​​要でした:

def get_user_profile(id):
    if Users(id=id).Business_or_Student = 'B':
        return Businesses(id=id)
    else:
        return Students(id=id)

User移動中に、Django の組み込みオブジェクトの機能がかなり制限されていることがわかりましたUserProfile。作成したクラスでそれを拡張する必要があり、追加StudentBusinessテーブルがありました。私が Django 管理者で行っているすべてのパッチ適用を考えると、私はいつも別の方法で行っていたため、Django モデルに比較的慣れていないため、これが最善の方法なのか、それともそうすべきなのかわかりません。企業と学生のすべての情報をテーブルに貼り付けUserProfileて、2 つを異なるグループで区別するか、組み込みUserオブジェクトでこれをすべて行う方法さえあれば。

企業と学生も異なるインターフェイスを持っているため、Django プロジェクト内で 2 つを別のアプリとして設定し、ビュー、モデルなどを完全に分離することを真剣に検討しています。それは次のようになります。

MyProject/
    MyProject/ (project folder, Django 1.4)
    mainsite/
    students/
    businesses/

私の最大の関心事の 1 つは、Django 管理者に関するものです。拡張Userでは、次のコードを追加する必要がありました。

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'profile'

class UserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

ただし、ユーザーのビジネスまたは学生の側面に関する情報Userがプルアップされたときに Django 管理画面に表示されるようにしたいと思いますが、モデルの一部はForeignKeyandStudentモデルBusinessにあります。またはそれに接続された1 つのオブジェクト。管理者に条件付きインラインを追加する方法がわかりません。StudentBusinessUserUserStudent Business

質問: この構造とこれらの問題を考慮して、このサイト、特にデータ モデルを設定する最善の方法は何ですか?

4

2 に答える 2

5

これは完全な解決策ではありませんが、どこから始めればよいかがわかります。

  • UserProfileでモデルを作成しますmainsite。これは、両方のタイプのユーザーに共通の属性を保持します。Userフィールドを持つモデルに関連付けOneToOne(...)ます。
  • 各アプリ (学生/ビジネス)Businessとにさらに 2 つのモデルを作成します。これらのモデルはそれぞれと関係がStudentあります(または から継承します)。これは、そのタイプのユーザーに固有の属性を保持します。ドキュメント:マルチテーブルの継承/ OneToOne RelationshipsOneToOneUserProfileUserProfile
  • にフィールドを追加して、UserProfileそれがビジネスか学生のプロファイルかを区別することができます。

次に、コンテンツ管理の場合:

  • 競合を自動的にチェックする関数を定義しsave()ます (たとえば、 と の両方BusinessにエントリStudentがあるUserProfile、またはエントリがないなど)。
  • __unicode__()必要に応じて表現を定義します。
于 2012-10-17T04:17:56.933 に答える
4

私はあなたの問題を理解したと思います...多分これはうまくいくでしょうか?さまざまなサブクラス (学生と企業) に継承される抽象 CommonInfo クラスを作成します。

class CommonUser(models.Model):      
    user = models.OneToOne(User)
    <any other common fields>

    class Meta:
        abstract = True


class Student(CommonUser):
    <whatever>

class Business(CommonUser):
    <whatever>

この場合、モデルは各テーブルの基本クラス フィールドを使用して DB に作成されます。したがって、学生と一緒に作業しているときは、

students = Students.objects.get.all() 

共通情報を含むすべての学生を取得します。

次に、生徒ごとに次のことを行います。

for student in students:
    print student.user.username

同じことがビジネス オブジェクトにも当てはまります。

ユーザーを使用して生徒を取得するには:

student = Student.objects.get(user=id)

ユーザー名は一意であるため、新しい学生またはビジネスを作成するときに、既存のユーザー名が保存されている場合は例外が発生します。

リンクを追加するのを忘れていました

于 2012-10-17T09:49:33.913 に答える