如何在Django中处理多用户类型

  介绍

如何在Django中处理多用户类型?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

1。不要使用Django内置的用户模型,尽管它能满足应用程序的所有要求。

正如官方Django文档强烈建议为新项目使用自定义用户模型。需求总是在变,只用固定的模型不太现实,并且一旦设置了AUTH_USER_MODEL后续再修改就很麻烦了。

2。无论最后选择什么方案,无论有什么业务,都始终只使用一个Django模型来处理身份验证。

永远都使用一个用户模型,这就是标题为什么是处理多用户类型而不是多用户模型。这也就能使用统一的身份认证机制。它仍然可以拥有多种用户类型。

<强>方案

不同的项目要求设计出来的方案也是不同的,不妨先问问自己这几个问题:

<李>

需要维护多少种用户类型?

<李>

用户可以同时拥有多种角色吗?比如用户可以同时成为学生或老师吗?

<李>

不同用户类型是否需要存储不同的信息吗?

一种非常常见的情况就是拥有普通用户和管理员。在这种场景下,可以使用内置的is_staff来区分普通用户和管理员。实际上,内置模型中有两个字段来处理这种情况:is_staff和is_superuser .is_staff标志着用户是否允许登录Django管理页面,至于该用户能做什么或不能做什么,就由权限框架来授权。而is_superuser是一个额外的标志,意味着拥有所有权限,所以这里可以看出来,权限有两个级别的管理。

<强>需要维护多少种用户类型? 强如果类型数量比较少,那就可以效仿Django的方式,用几个字段来简单表示:

class 用户(AbstractUser):   时间=is_student 才能;models.BooleanField(默认=False)   is_teacher 才能=,models.BooleanField(默认=False)

这可能是处理多种用户类型最简单的方法了。

另一种选择是,只用一个字段就来表示用户:

class 用户(AbstractUser):   ,USER_TYPE_CHOICES =, (   ,,(1,& # 39;学生# 39;),   ,,(2),& # 39;老师# 39;),   ,,(3),& # 39;秘书# 39;),   ,,(4,& # 39;主管# 39;),   ,,(5,& # 39;行政与# 39;),   ,)=,,user_type  models.PositiveSmallIntegerField(选择=USER_TYPE_CHOICES)

超过3种类型可以选择这种方式。

<强>用户可以同时拥有多种角色吗?

如果用户是可以同时承担多种角色的话,那么就需要一个额外的表表示它们多对多的关系,显然可以用到ManyToManyField:

class 角色(models.Model):   ,& # 39;& # 39;& # 39;   ,从而Role  entries 断开连接;managed  by 从而系统,   ,automatically  created  via  a  Django  data 迁移。   ,& # 39;& # 39;& # 39;   STUDENT =, 1   TEACHER =, 2   SECRETARY =, 3   SUPERVISOR =, 4   ADMIN =, 5   ,ROLE_CHOICES =, (   ,,(学生,& # 39;学生# 39;),   ,,(老师,& # 39;老师# 39;),   ,,(部长,& # 39;秘书# 39;),   ,,(主管,& # 39;主管# 39;),   ,,(ADMIN, & # 39;行政与# 39;),   ,)=,,id  models.PositiveSmallIntegerField(选择=ROLE_CHOICES, primary_key=True)      ,def  __str__(自我):   ,,return  self.get_id_display ()      class 用户(AbstractUser):=,,roles  models.ManyToManyField(角色)

这种方案其实并不常见,因为Django已经提供权限组的功能并拥有灵活的权限管理。你得评估下创建自定义权限组是否更好。

<强>不同用户类型是否需要存储不同的信息吗? 强如果存储的信息(如头像)与所有用户相关,那么最好的做法就是直接向用户模型添加额外的字段。

如果储存的信息只与特定的类型用户有关,那么可以用>得到django.contrib.auth.models  import  AbstractUser   得到django.db  import 模型      class 用户(AbstractUser):   时间=is_student 才能;models.BooleanField(默认=False)   时间=is_teacher 才能;models.BooleanField(默认=False)      class 学生(models.Model):   user 才能=,models.OneToOneField(用户,on_delete=models.CASCADE, primary_key=True)   ,,…      class 老师(models.Model):   user 才能=,models.OneToOneField(用户,on_delete=models.CASCADE, primary_key=True)   ,,…

<强>总结

可以参照如下的流程图来帮助设计:

如何在Django中处理多用户类型

如何在Django中处理多用户类型