服务器之家

服务器之家 > 正文

Django处理多用户类型的方法介绍

时间:2021-06-27 00:39     来源/作者:栖迟于一丘

起步

这是许多开发者在项目初期要面临的一个普遍问题。要怎样来处理多用户类型

本文讲介绍对于不同场景和业务需求如何设计用户模型。为项目提供指导设计。

设计之前

在梳理用户设计之前,有几个前提需要遵守。

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

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

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

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

方案

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

  • 需要维护多少种用户类型?
  • 用户可以同时拥有多种角色吗?比如用户可以同时成为学生或老师吗?
  • 不同用户类型是否需要存储不同的信息?

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

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

?
1
2
3
class user(abstractuser):
  is_student = models.booleanfield(default=false)
  is_teacher = models.booleanfield(default=false)

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

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

?
1
2
3
4
5
6
7
8
9
10
class user(abstractuser):
 user_type_choices = (
   (1, 'student'),
   (2, 'teacher'),
   (3, 'secretary'),
   (4, 'supervisor'),
   (5, 'admin'),
 )
 
 user_type = models.positivesmallintegerfield(choices=user_type_choices)

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class role(models.model):
 '''
 the role entries are managed by the system,
 automatically created via a django data migration.
 '''
 student = 1
 teacher = 2
 secretary = 3
 supervisor = 4
 admin = 5
 role_choices = (
   (student, 'student'),
   (teacher, 'teacher'),
   (secretary, 'secretary'),
   (supervisor, 'supervisor'),
   (admin, 'admin'),
 )
 
 id = models.positivesmallintegerfield(choices=role_choices, primary_key=true)
 
 def __str__(self):
   return self.get_id_display()
 
class user(abstractuser):
 roles = models.manytomanyfield(role)

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

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

如果储存的信息只与特定的类型用户有关,那么可以用 onetoonefield 来进行拓展:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.contrib.auth.models import abstractuser
from django.db import models
 
class user(abstractuser):
  is_student = models.booleanfield(default=false)
  is_teacher = models.booleanfield(default=false)
 
class student(models.model):
  user = models.onetoonefield(user, on_delete=models.cascade, primary_key=true)
  ...
 
class teacher(models.model):
  user = models.onetoonefield(user, on_delete=models.cascade, primary_key=true)
  ...

总结

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

Django处理多用户类型的方法介绍

总的来说,始终都用一个用户模型来处理身份认证,不要在多有模型中存储用户名和密码。通常对 user 模型添加布尔标记位就能适应大多数情况。如果需要灵活的权限管理,可以使用django内置的权限框架或第三方库。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

原文链接:http://www.hongweipeng.com/index.php/archives/1793/

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部