如何在Django中处理多个动态用户类型?

如何在Django中处理多个动态用户类型?,django,python-3.x,Django,Python 3.x,我有一个问题,我已经坚持了好几天,似乎找不到解决办法,这变得非常令人沮丧 在我的模型中,我有公司。每个公司有2个认证和授权小组:主管和非主管 在这两个组中,每个公司都有几个动态子组,我称之为员工类型。这些EmployeeType可以由公司管理员在管理面板中创建,然后分配给其中一个组 总结:每家公司将有2个小组。每个小组将有无限的员工类型。每个EmployeeType将有无限的用户 尽管所有公司的员工组都相似,但员工类型可以有相似的名称,但不应在公司之间共享 class Company(model

我有一个问题,我已经坚持了好几天,似乎找不到解决办法,这变得非常令人沮丧

在我的模型中,我有公司。每个公司有2个认证和授权小组:主管和非主管

在这两个组中,每个公司都有几个动态子组,我称之为员工类型。这些EmployeeType可以由公司管理员在管理面板中创建,然后分配给其中一个组

总结:每家公司将有2个小组。每个小组将有无限的员工类型。每个EmployeeType将有无限的用户

尽管所有公司的员工组都相似,但员工类型可以有相似的名称,但不应在公司之间共享

class Company(models.Model):
    ....

class EmployeeType(models.Model):
    ....
    employee_type = models.CharField(
        max_length=32,
        default='Server'
    )
    group = models.ForeignKey(
        Group,
        on_delete=models.CASCADE,
        null=True
    )
class User(AbstractUser):
    ....
    company = models.ForeignKey(
        Company,
        on_delete=models.CASCADE,
        null=True
    )
    employee_type = models.ForeignKey(
        EmployeeType,
        on_delete=models.CASCADE,
        null=True,
    )
如何使A公司可以拥有自己的EmployeeType,B公司可以拥有自己的EmployeeType,但两个公司中EmployeeType的名称可以相同,同时确保A公司看不到B公司的EmployeeType
如果这看起来很简单,我很抱歉,但当员工类型变得活跃时,我感到困惑。当我尝试这一点时,我最终会产生循环逻辑,似乎无法理解它的正确结构。

让我一次回答你的所有问题

这是建立动态用户类型创建模型的正确方法吗?没有

组/主管应为EmployeeType中的布尔字段。它不需要是单独的模型和外键。这将使您的身份验证和授权功能更加容易,因为据我所知,它们只是真实/虚假的

用户应该将EmployeeType设置为ManyToManyField,因为将来可能需要向员工添加更多角色/EmployeeType

用户中不需要Company ForeignKey,因为它将通过EmployeeType ManytoManyField关系进行处理

在EmployeeType中添加Company ForeignKey,因为您将从Company、EmployeeType和User中删除组外键

因此,您的模型应如下所示:

class Company(models.Model):
    ....


class EmployeeType(models.Model):
    ....
    employee_type = models.CharField(
        max_length=32,
        default='Server'
    )
    company = models.ForeignKey(
        Company,
        on_delete=models.CASCADE,
        null=True
    )
    supervisor = models.BooleanField(default=False)


class User(AbstractUser):
    ....

    employee_type = models.ManyToManyField(
        EmployeeType,
        null=True,
    )

但我不应该使用Django的内置组进行身份验证和授权吗?这是故事的另一部分。是的,理想情况下您应该这样做,但在企业系统中,Django Group s有时可能不够。因此,请帮助我理解我在这里遇到的挫折。通常我应该使用组,但在这种情况下不起作用。你能解释一下为什么它不起作用吗?BooleanField感觉非常肤浅,这似乎不正确,尽管我在这里不是专家。Django组是可以用来标准化用户角色的实体。因此,根据这种逻辑,可以使用组。在您的用例中,需要将Django组扩展到EmployeeTypes中,并对其进行定制,以适应从多个公司推断出的产品的SaaS性质,因为您需要组对不同的公司相互排斥。就BooleanField而言,如果您案例中的自定义组(主管)具有更多属性,比如说它是EmployeeTypes的超集,那么将其作为一个单独的模型是有意义的。我将提出一个更具体的问题,以处理将用户组扩展到广泛和特定员工类型的问题。。非常感谢。