【问题标题】:Multiple User type with Django使用 Django 的多用户类型
【发布时间】:2016-10-26 08:14:23
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您的意思是使用type_field 来区分学生对象和教师对象吗? (带有type_field 一个由您的表单发送到/users 的参数)
  • 在第一次创建用户时,我们要求他们选择那里的类型并填写基本的东西,如姓名和电子邮件,这将适合 Django 的用户模型。但是这之后的所有操作都需要抓取正确的 USER profile 要求他们填写不常见的字段
  • 请看看下面的答案,如果它符合您的需要,请告诉我。

标签: python django django-models django-users


【解决方案1】:

由于您已经为学生和老师开设了两个不同的课程,因此您不必去寻找额外的领域。一个简单的方法可能如下所示。

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 原则。

【讨论】:

  • 但是,例如,当我请求 GET 用户 /user/5 时,我如何知道要使用哪个模型?
  • 而不是 /user/{id} ,使用 /teacher/{id}。如果你必须使用 /usr/{id},那么你必须从用户对象中获取一个教师对象。可能看起来像这样if teacher.user.id == user.id:
  • 如果用户登录你不知道他是学生还是老师,那么使用通用 /user/{id} 是唯一的选择吗?
  • 一种直接的方法是,您应该使用 django 的内置 group-permission framework,而不是使用自定义模型来处理角色(和权限)。创建名为教师和学生的组。将用户添加到组。登录后,您可以使用teacher=Group.objects.get('teacher'); if teacher in request.user.groups.all()查看登录用户组。
【解决方案2】:

你可以使用类似的东西:

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,你将使用Student模型创建用户,如果是老师,你将使用Teacher模型。

注意:您可能需要将Person 模型置于内置User 模型的子类之上。

编辑:

我已经编辑了上面的模型,以考虑下面 cmets 中的要求。

现在,要通过 id 检索用户,您可以在视图中使用以下代码:

user = Person.objects.get(id=id)  # id is the view param
if hasattr(user, 'student'):
    print("Student")
else:  # hasattr(user, 'teacher')
    print("Teacher")

【讨论】:

  • 好吧,这是有道理的,但是如果我请求一个 GET /users/4,你将如何进行选择。这是您放入序列化程序或制作一些中间件的东西吗?
  • 您没有随请求发送任何额外信息以了解对象类型(学生或教师)?
猜你喜欢
  • 2017-09-02
  • 2017-11-14
  • 2016-04-03
  • 2012-11-21
  • 1970-01-01
  • 2018-07-02
  • 2020-04-19
  • 2013-06-01
  • 1970-01-01
相关资源
最近更新 更多