2016-10-26 49 views
0

使用Django,我們有兩種類型的用戶(教師和學生)共同領域和不常見的領域多種用戶類型和Django

在我們的嚮導,我們先用一個額外的type_field 每次手術後到/用戶共同領域之後應該能夠找出它需要使用的模型(教師或學生)。

我們正在考慮製作兩個模型(教師和學生)以及一對一的領域。

但是,我們如何將type_field連接到每個操作的正確模型?

+0

你的意思是說你使用'type_field'來區分學生和老師對象嗎? ('type_field'是你的表單發送給'/ users'的參數) – ettanany

+0

在用戶第一次創建時,我們要求他們選擇類型並填寫名稱和電子郵件等基本內容,這些內容將適用於Django的用戶模型。 但是之後的所有操作都需要抓取正確的USER配置文件,要求他們填寫不常見的字段 – user3411864

+0

請看下面的答案,並讓我知道它是否適合您的需要。 – ettanany

回答

0

您可以使用類似:

class Person(models.Model): 
    first_name = models.CharField(max_length=255) 
    last_name = models.CharField(max_length=255) 
    # more common fields 

class Student(Person): 
    specific_field_to_student = models.CharField(max_length=255) 
    # more fields 


class Teacher(Person): 
    specific_field_to_teacher = models.CharField(max_length=255) 
    # more fields 

在你的數據庫,你將有3個表(yourapp_personyourapp_studentyourapp_teacher)。現在,如果type_field的值是學生,則將使用Student模型創建用戶,如果它是教師,則將使用Teacher模型。

注:您可能需要作出的一個子類以上Person模型內置User模型。

編輯:

我已經編輯上面的模型考慮到在下面的意見要求。現在

,通過ID檢索用戶,您可以在視圖中使用下面的代碼:

user = Person.objects.get(id=id) # id is the view param 
if hasattr(user, 'student'): 
    print("Student") 
else: # hasattr(user, 'teacher') 
    print("Teacher") 
+0

好吧,這是有道理的,但如果我例如請求一個GET/users/4,你如何做選擇。這是你放入序列化程序或製作中間件的東西嗎? – user3411864

+0

您的請求中沒有任何額外的信息來了解對象類型(學生或教師)? – ettanany

+0

@ user3411864看看上面的編輯 – ettanany

0

你不必去爲一個額外的領域,因爲你已經給學生和教師兩個不同的類。一個簡單的方法可能如下所示。

from django.contrib.auth.models import User 

class Teacher(User): 
    extra_field_1 = models.Fieldtype() 
    ... 
    ... 

class Student(User): 
    extra_field_1 = models.Fieldtype() 
    ... 
    ... 

您可以同時提供用戶的類型相同的登記表,並在點擊旁邊帶他們到基於價值的我是一名教師/學生實地下一頁。在這種情況下,我建議你使用atomic blocks,如果你不想在註冊過程失敗的情況下保存數據,或者用戶選擇了錯誤的選擇並且他們想要返回。通過這種方法,每個繼承模型都有username, first_name, last_name and email,您不必將其中任何一個插入到教師或學生模型中。 然後你必須爲每個模型創建forms。您可以使用modelform一個更好的方法將使用class based views,因爲這會減少很多代碼並遵循dry原則。

+0

但是,我如何知道在請求GET用戶/用戶/ 5時要使用哪個模型? – user3411864

+0

而不是/ user/{id},請使用'/ teacher/{id}'。如果您必須使用/ usr/{id},那麼您必須從用戶對象中提取引用的教師對象。可能是這樣的'如果teacher.user.id == user.id:'。 – cutteeth

+0

好,如果用戶登錄你不知道他是學生還是老師,那麼使用general/user/{id}是唯一的選擇嗎? – user3411864