我目前正在创建一个结构,其中有员工属于一家公司。在这个公司中,我需要能够创建几个组。如果您愿意,可以分配更少的权限给较低的等级,更多的权限给较高的等级。
我想采用对象级权限,并发现django-guardian项目正好提供了我所需的功能。它与本机用户和组对象一起使用,因此我现在正在尝试找到一种实现本机组对象在公司对象中的方法。
我面临的问题是组中的名称是唯一的。因此,如果两个公司添加相同的组,将会出现错误。
我找到了一种可行的实现方式,但对我来说似乎有些“hacky”。在我的公司中,我声明了一个引用Group的group变量:
class Company(models.Model):
...
groups = models.ManyToManyField(Group, through='CompanyRole')
CompanyRole基本上包含组名和公司与组的引用。
class CompanyRole(models.Model):
group = models.ForeignKey(Group)
company = models.ForeignKey(Company)
real_name = models.CharField(max_length=60, verbose_name=_('Real name'))
objects = CompanyGroupManager()
我创建了一个自定义管理器,其中包含一个方便的方法来添加一个新的“公司组”
class CompanyGroupManager(models.Manager):
def create_group(self, company, group_name):
un_group_name = str(company.id) + '#' + group_name
group = Group.objects.create(name=un_group_name)
company_group = self.model(
real_name=group_name,
company=company,
group=group
)
company_group.save(using=self._db)
return company_group
这里是我不太舒服的部分。为了解决Group模型中唯一名称的问题,我使用了公司id、一个哈希标志和实际的组名的组合,以避免冲突。
现在我的问题是:在我的情况下有更好的方法吗?我有所遗漏,还是这是实现我所需的好方法?