检查扩展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 :(得分:3)
没有关于Student
表中保存的Teacher
和User
模型的数据,因此您必须查询相关对象。
如果您不需要实际的配置文件(Student
或Teacher
对象),最快的方法是使用相关集上的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
旁注:
如果您的用户不应该有多个Student
或Teacher
对象相关,那么最好使用OneToOneField
代替ForeignKey
。这样,您就不必为all()
等烦恼,但您可以使用user.student
或user.teacher
访问相关的模型实例。这也允许您使用select_related
,以便在单个查询中提取用户对象和学生或教师对象。
答案 1 :(得分:2)
如果您拥有User
模型并想要检查该模型是否与Teacher
或Student
模型相对应,则需要从每个表中获取相应的行:
try:
Student.objects.get(student_user=request.user)
is_student = True
except Student.DoesNotExist:
is_student = False
老师也一样。 is_student
和is_teacher
会分别告诉您User
是Student
还是Teacher
。如果用户既是学生又老师,这也适用于奇怪的情况:)在这种情况下没用,但认为它可以帮助学校中的其他角色。