django中的用户类型

在我的Web应用程序中,用户属于客户或公司。 我尝试这样实现:

class User(AbstractBaseUser,PermissionsMixin):
    username = None
    email = models.EmailField(max_length=255,unique=True)
    client = models.ForeignKey('client.Client',null=True,blank=True,on_delete=models.CASCADE)
    company = models.ForeignKey('company.Company',on_delete=models.CASCADE)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()

    username_FIELD = 'email'
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email

    def has_perm(self,perm,obj=None):
        return True

    def has_module_perms(self,app_label):
        return True

    @property
    def is_staff(self):
        return self.is_admin

    @property
    def is_company(self):
        if self.company:
            return True

        return False

    @property
    def is_client(self):
        if self.company:
            return True

        return False

    def save(self,*args,**kwargs):
        if self.client and self.company:
            raise ValidationError("Test")

        super(User,self).save(*args,**kwargs)

我需要这些差异,因为一个公司可以维护多个客户,而一个客户和一个公司可以有多个用户。

但这是实现此目标的最佳方法吗?我已经读到我无法在Django中创建多个用户类,因此我只能在一个用户类中实现此功能。

njustllm 回答:django中的用户类型

您的代码imo看起来还不错,这与关于如何使用django创建角色的最佳(imo)教程相匹配:https://simpleisbetterthancomplex.com/tutorial/2018/01/18/how-to-implement-multiple-user-types-with-django.html 另一方面,您实际上可以通过创建单独的模型和授权来自己制作所有东西-要做很多工作,但您将掌控一切。

,

对我来说,这不是有效的好方法。不应更改User的基本结构,并编写诸如is_admin之类的东西。

一种解决方法是:

  • 为您将拥有的任何类型的用户创建配置文件模型:RegularProfileCompanyProfile等。这些配置文件将具有User属性(OneToOneField)。 / li>
  • 这些个人资料可以继承mixin个人资料的公共属性(addressprofile_picture ...)。
  • 每个配置文件将具有仅属于它的属性和方法:company_contractbirth_date(对于普通用户),等等。
  • 然后,您将为这些用户创建组,不用担心,如果只有一种类型的配置文件属于一个组。无需阅读任何博客,Django documentation对此非常有用,这是我第一次需要组和权限时所读的内容。
  • 之后,您检查每个视图是否已连接的用户属于正确的组,以便他可以访问该视图。尝试覆盖has_perm方法时,您几乎完成了所有工作:不要在这里停下来,并使用组和权限附带的所有功能! 干燥(请勿重复)。

对我来说,这种工作方式是我所知道的最干净的

  • 您不会将与常规用户有关的内容与与公司有关的内容混合在一起,因此维护起来非常容易
  • 仍然,您可以为它们两者拥有共同的东西(例如,使用mixin类继承),
  • 您可以明确限制每个组访问一个视图或另一个视图的权限,
  • 我遇到了与您完全相同的问题,并且我对这种工作方式非常满意(如果您确实需要反馈:-))。
本文链接:https://www.f2er.com/2857108.html

大家都在问