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

作者:栖迟于一丘 时间:2022-11-30 10:16:54 

起步

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

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

设计之前

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

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

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

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

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

方案

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

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

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

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

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

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


class User(AbstractUser):
 is_student = models.BooleanField(default=False)
 is_teacher = models.BooleanField(default=False)

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

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


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 :


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 来进行拓展:


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/

标签:django,多用户,类型
0
投稿

猜你喜欢

  • PHP fprintf()函数用法讲解

    2023-06-01 20:09:20
  • 浅谈Python反射 & 单例模式

    2023-10-14 21:16:30
  • 使用python从三个角度解决josephus问题的方法

    2022-02-22 02:19:55
  • PHP抽象工厂模式Abstract Factory Pattern优点与实现方式

    2023-05-25 03:04:57
  • SQL SERVER数据库开发之asp存储过程应用

    2008-05-19 12:55:00
  • 详解vue-cli 本地开发mock数据使用方法

    2024-05-10 14:20:21
  • javascript中声明函数的方法及调用函数的返回值

    2024-03-21 23:49:04
  • python办公自动化之excel的操作

    2023-11-20 14:01:01
  • python生成requirements.txt文件的推荐方法

    2021-02-04 01:02:30
  • php验证session无效的解决方法

    2023-08-15 06:52:39
  • VS Code有哪些奇技淫巧(必知)

    2022-01-07 21:10:47
  • python中如何实现将数据分成训练集与测试集的方法

    2022-10-03 23:11:45
  • 如何配置关联Python 解释器 Anaconda的教程(图解)

    2021-06-13 15:27:30
  • Vue用v-for给循环标签自身属性添加属性值的方法

    2024-04-10 10:30:56
  • Pandas实现DataFrame的简单运算、统计与排序

    2022-03-29 02:09:54
  • Python根据成绩分析系统浅析

    2023-08-02 20:25:07
  • django迁移文件migrations的实现

    2022-10-27 02:48:44
  • python实现记事本功能

    2022-04-02 09:54:19
  • Python Flask 转换器的使用详解

    2023-06-30 15:42:09
  • python利用socket实现客户端和服务端之间进行通信

    2022-04-23 07:34:59
  • asp之家 网络编程 m.aspxhome.com