Django的多用户类型

时间:2016-10-26 08:14:24

标签: python django django-models django-users

使用Django我们有两种类型的用户(教师和学生),具有共同的字段和非常见的字段

在我们的向导中,我们首先使用额外的type_field将公共字段发布到/ users 此后的每个操作都应该能够确定需要使用哪个模型(教师或学生)。

我们正在考虑制作两个具有一对一领域的模型(教师和学生)。

但是我们如何在每次操作时将type_field连接到正确的模型?

2 个答案:

答案 0 :(得分: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")

答案 1 :(得分: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原则。