gpt4 book ai didi

python - Django:实现多个用户级别/角色/类型

转载 作者:行者123 更新时间:2023-12-03 15:48:32 36 4
gpt4 key购买 nike

我使用Django已经有一段时间了,但是直到现在我还没有想到这一点。

当前,我有一个包含不同用户级别的项目。通常,根据我过去的经验,我只使用Django开发系统,只有两个用户级别,即 super 用户和普通/常规用户。所以我的问题是,什么是在模型/数据库中呈现这些不同用户级别的有效方法? 在这里,我将以学校系统为例,并提供一些实现该系统的初步想法。

用户级别:

  • 管理员( super 用户和员工)
  • 校长
  • 老师
  • 学生

  • 方法1:根据每个用户级别添加新表
    from django.contrib.auth.models import AbstractUser
    from django.db import models

    class User(AbstractUser):
    user = models.CharfieldField(max_length = 10, unique = True)

    class Admin(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)

    class Pricipal(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)

    class Student(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)

    方法2:在用户模型中添加其他用户类型属性
    from django.contrib.auth.models import AbstractUser
    from django.db import models

    class User(AbstractUser):
    user = models.CharfieldField(max_length = 10, unique = True)
    is_superuser = models.BooleanField(default = False)
    is_staff = models.BooleanField(default = False)
    is_principal = models.BooleanField(default = False)
    is_teacher = models.BooleanField(default = False)
    is_student = models.BooleanField(default = False

    '''
    User table in DB:
    user | is_superuser | is_staff | is_principal | is_teacher | is_student
    '''

    我的想法:

    在方法1中,由于内置的​​用户模型具有两个字段is_staff和is_superuser,是否可以像上例中那样将字段实现/更改为SuperUser/Admin表?这意味着当我创建一个admin/superuser时,我希望它在Admin表中添加新行,而不是添加新用户并将用户的is_superuser和is_staff字段更新为内置用户模型中的1。

    在方法2中,问题在于具有不同访问权限的表直接连接到它。例如,薪金模型(学生用户无法访问)与用户模型(包含学生用户)具有直接链接。

    我希望我能够获得一些见识,以及实现这一目标的正确有效方法,以防止将来出现任何实现带来的不便和错误。非常感谢你。

    最佳答案

    我认为您在使用方法2的正确道路上。它更轻便,更直接。

    我不会为每个权限级别使用自定义的“类似用户”模型。过于复杂,无法扩展,无法增加查询数量,对您的问题没有太大好处。 不是您的UML模式,但其内容必须保证您的许可要求

    如果权限级别不是互斥的:

    from django.db import models
    from django.contrib.postgres.fields import ArrayField


    class User(AbstractUser):
    ADMIN = 0
    PRINCIPLE = 1
    TEACHER = 2
    STUDENT = 3
    USER_LEVEL_CHOICES = (
    (ADMIN, "Admin"),
    (PRINCIPLE, "Principle"),
    (TEACHER, "Teacher"),
    (STUDENT, "Student"),
    )
    status = ArrayField(
    models.IntegerField(choices=USER_LEVEL_CHOICES, blank=True, default=STUDENT),
    )

    但是您需要更广泛的反射(reflection)。

    我认为您正在谈论两个单独的问题: 多态性权限
  • 多态:

  • 多态是对象采取多种形式的能力。对于Django模型,可以使用许多策略来完成: OneToOneField-如您所提到的- 多表继承抽象模型代理模型

    很好的资源:这个 article和有关 model inheritance的Django文档

    这个非常复杂的问题全都涉及到: 相同实体的几种形式有多少相似或不同。以及哪些操作特别相似或不同(数据形状,查询,权限等)
  • 权限设计:

  • 您可以在几种模式中进行选择
  • 面向模型的权限:授予用户对Model的“添加”,“查看”,“编辑”或“删除”权限。这是使用内置的Permission模型在Django中完成的,该模型具有ContentType的ForeignKey
  • 面向对象的权限:为每个Model 实例授予用户“添加”,“查看”,“编辑”或“删除”权限。 一些软件包提供了此功能,例如django-guardian
  • 面向规则的权限:通过自定义逻辑(而不是M2M表)向用户授予对Model实例的权限。 django rules包提供了这种架构。
  • 关于python - Django:实现多个用户级别/角色/类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61040342/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com