使用多个用户身份验证模型替换django中的用户模型

时间:2013-12-06 10:48:27

标签: python django django-users

我正在创建一个应用程序,它将有两种类型的用户教师和学生。它们都可以连接到我的门户网站,但它们具有不同的权限。他们也有不同的领域(老师有关于姓名的领域,研究生学习后的研究领域等,学生有姓名,父母姓名,他正在上哪些课程等)。我想扩展用户模型并创建两种类型的用户,如上所述。我在this上运行了关于使用AUTH_USER_MODEL扩展用户模型并继承AbstractBaseUser,从而在您的应用中创建:

class MyUser(AbstractBaseIser):
    #custom user fields

并设置

AUTH_USER_MODEL = 'myapp.MyUser'

在设置文件中。

但如果我理解正确,它只能发生在一个自定义用户身上。是否更适合我想要的东西

user = models.OneToOneField(User)

在我的客户用户模型中(例如教师)?可以AUTH_USER_MODEL除了字典能够区分两种类型的用户吗?使用OneToOneField对性能有多大影响,因为doc说如果使用OneToOnField则必须执行许多连接

抱歉,我没有提供任何自己的代码,因为我还没有编写任何代码。我希望在实施之前为我解决这个问题。

1 个答案:

答案 0 :(得分:3)

通过MyUser保持身份验证。做这样的事情:

class UserType(models.Model):
    type = ... # teacher, student, whatever

class MyUser(models.Model):
    name = ...
    username = ...
    user_type = models.ForeignKey('UserType',...

class TeacherProfile(models.Model):
    user = models.ForeignKey('MyUser',...
    user_type = models.ForeignKey('UserType',...
    gradebook = ...

class StudentProfile(models.Model):
    user = models.ForeignKey('MyUser',...
    user_type = models.ForeignKey('UserType',...
    homework = ...
MyUser模型上的

有一个类似的方法:

    def get_profile(self):
        if user_type_is_teacher():
            return TeacherProfile.objects.get(user=self, user_type=self.user_type)

现在,如果您有学生用户u,您可以说

u.get_profile().homework

您可以自己添加更多错误处理等。