簡體   English   中英

如何使用具有非常不同屬性的兩種類型的用戶設置Django模型

[英]How to set up Django models with two types of users with very different attributes

注意:自從版本1.5以來Django的用戶模型更新后,我再次提出這個問題

我正在重建並改進已經存在的Django站點並將其從Webfaction轉移到Heroku,從Amazon的SimpleDB轉移到Heroku Postgres(盡管在開發時在Sqllite3上進行本地測試)。 我正在做的很多事情都是使用內置的Django功能,比如Django管理員,用戶身份驗證等。

從概念上講,該網站有兩種用戶:學生和企業。 這兩種類型的用戶具有完全不同的權限和存儲的信息。 情況就是這樣,在網站的原始結構中,我們建立了如下數據模型:

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表中提供了簡單的用戶信息,然后在Students and Businesses表中提供了更詳細的信息。 獲取用戶的完整個人資料需要此偽代碼:

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

在移動過程中,我發現Django的內置User對象具有非常有限的功能,我不得不使用我創建的UserProfile類擴展它,然后有額外的StudentBusiness表。 鑒於我在Django管理員中所做的所有補丁,並且對Django模型相對不熟悉,因為我總是采用不同的方式,我不確定這是否是最好的方法,或者我應該只需將企業和學生的所有信息粘貼在UserProfile表中,然后將兩者區分為不同的組,或者甚至在內置的User對象中有一些方法可以完成這一切。

由於企業和學生也有不同的界面,我正在認真考慮在我的Django項目中將兩者設置為不同的應用程序,從而完全分離他們的視圖,模型等。 這看起來像是這樣的:

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

我最關心的一個問題是Django Admin。 在擴展User ,我必須添加以下代碼:

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

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

但是,當User被拉起時,我希望用戶的業務或學生方面的信息顯示在Django管理員中,但是模型的ForeignKey部分在StudentBusiness模型中,因為每個Student / Business都有User但每個User只有一個Student 一個Business對象與之相關聯。 我不知道如何為Admin添加條件內聯。

問題:鑒於這種結構和這些問題,設置此站點的最佳方式是什么,尤其是數據模型?

這不是一個完整的解決方案,但它會讓您了解從哪里開始。

  • mainsite創建UserProfile模型。 這將保留兩種類型用戶的任何公共屬性。 使用OneToOne(...)字段將其與User模型相關聯。
  • 在每個應用程序(學生/企業), BusinessStudent創建另外兩個模型,這些模型與UserProfile具有OneToOne關系(或從UserProfile繼承)。 這將包含特定於該類型用戶的屬性。 文檔: 多重繼承 / OneToOne關系
  • 可以UserProfile添加一個字段,以區分它是商家還是學生的個人資料。

然后,對於內容管理:

  • 定義save()函數以自動檢查沖突(例如,有一個與UserProfile關聯的BusinessStudent條目,或者沒有條目)。
  • 必要時定義__unicode__()表示。

我希望我能理解你的問題...也許這可行嗎? 您創建一個抽象的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

對於Business對象也是如此。

讓學生使用用戶:

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

用戶名將是唯一的,因此在創建新的學生或企業時,如果正在保存現有用戶名,則會引發異常。

忘了添加鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM