检查用户帐户模型类型

时间:2014-06-19 12:05:33

标签: django django-users

检查扩展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是学生还是老师?

2 个答案:

答案 0 :(得分:3)

没有关于Student表中保存的TeacherUser模型的数据,因此您必须查询相关对象。

如果您不需要实际的配置文件(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,以便在单个查询中提取用户对象和学生或教师对象。

答案 1 :(得分:2)

如果您拥有User模型并想要检查该模型是否与TeacherStudent模型相对应,则需要从每个表中获取相应的行:

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

老师也一样。 is_studentis_teacher会分别告诉您UserStudent还是Teacher。如果用户既是学生老师,这也适用于奇怪的情况:)在这种情况下没用,但认为它可以帮助学校中的其他角色。