2014-06-19 94 views
1

檢查擴展了Django用戶模型的帳戶的模型類型的最佳方法是什麼? 我有兩個類型的用戶帳戶(學生和教師,讓說)擴展的Django用戶模型:檢查用戶帳戶模型類型

class Student(models.Model): 
    student_bd = models.CharField(max_length=50) 
    student_user = models.ForeignKey(User) 
    ... 

class Teacher(models.Model): 
    teacher_bd = models.CharField(max_length=50) 
    teacher_user = models.ForeignKey(User) 
    ... 

所以,我怎麼能知道是否request.user是學生或教師?

+0

'isinstance(request.user,Student)'? – haki

+0

這不起作用,因爲request.user始終是一個User實例。 –

+0

這就是爲什麼我測試它的子類 – haki

回答

2

如果你有User模型,並要檢查,如果該模型對應到任何一個TeacherStudent模式,您將需要從各獲得相應的行表:

try: 
    Student.objects.get(student_user=request.user) 
    is_student = True 
except Student.DoesNotExist: 
    is_student = False 

和同爲老師。 is_studentis_teacher會告訴你User分別是Student還是Teacher。如果用戶同時是學生老師,這也將在奇怪的情況下工作:)在這種情況下沒有用,但認爲它會幫助其他角色在學校。

+0

而在你問之前,不,沒有查詢數據庫沒有辦法做到這一點。 –

+0

謝謝你的回答,你幫了我。這就是我所做的:'Student.objects.filter(student_id = user.id).first()' - 它返回object或None。 –

+0

@LjubisaLivac請修改你的代碼,因爲它會產生錯誤的結果。您可以按照自己的方式進行,但只需稍作更改:'Student.objects.filter(student__student_user_id = user.id).first()'。你在做什麼是比較學生ID和用戶ID,這不是你想要的。上面修改後的代碼將(請求)用戶標識與學生的用戶標識進行比較。 –

3

沒有關於User表中保存的StudentTeacher型號的數據,因此您必須查詢相關對象。

如果您不需要實際輪廓(StudentTeacher對象),最快的方法是使用exists()功能的相關設置:

if request.user.student_set.exists(): 
    # student 
elif request.user.teacher_set.exists(): 
    # teacher 

如果你知道你會需要後來的配置文件對象,這將是更快地獲取結果併爲您在Python中的現有對象:

if request.user.student_set.all(): 
    # do something with student_set 
elif request.user.teacher_set.all(): 
    # do something with teacher_set 

旁註: 如果您的用戶不應該有多個對象相關的StudentTeacher,則使用OneToOneField而不是ForeignKey可能更好。這樣,您不必打擾all()等,但您可以通過user.studentuser.teacher訪問相關模型實例。這也將允許您使用select_related,以便在單個查詢中提取用戶對象和學生或教師對象。

+0

榮譽,不知道你可以通過這種方式去瀏覽相關對象。讓我的答案看起來...簡陋。從我+1。 –

+0

@knbk,非常感謝您的詳細解答,以及附註。愛德華多首先回答,所以我必須接受他的回答是正確的。順便說一句,我不知道爲什麼,但Django說''用戶'對象沒有'student_set''屬性。 –

+0

@LjubisaLivac您正在使用哪個版本的Django?默認名稱可能不同,但您始終可以指定相關名稱:'student_user = models.ForeignKey(User,related_name ='students')'。我總是指定一個相關的名字,因爲它避免了很多混淆。 – knbk