【发布时间】:2014-06-21 00:31:39
【问题描述】:
我目前正在创建一个结构,其中有属于公司的员工。 在这家公司内,我需要能够创建多个组。如果你愿意,排名。您可以将较少的权限分配给较低的等级,而将更多的权限分配给较高的等级。
我想获得对象级别的权限,我注意到 django-guardian 项目正好给了我我需要的东西。它适用于本机用户和组对象,因此我现在正试图找到一种在公司对象中实现本机组对象的方法。
我面临的问题是组中的名称是唯一的。所以如果两个公司加同一个组,就会出现错误。
我找到了一个在某种程度上可行但对我来说似乎很“hacky”的实现。在我的公司中,我声明了一个引用 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、井号和实际组名的组合以避免冲突。
现在我的问题是:在我的场景中是否有更好的方法,我是否遗漏了什么或者这是完成我需要的好方法?
【问题讨论】:
-
您可以在公司模型中使用硬连线的自定义权限而不是组吗?
-
基本上我想做的就是。在公司中,您应该能够创建可以授予全局权限和对象权限的部门。假设您有一个名为初级程序员的部门,我希望能够授予他们对某些项目的完全权限,但在全局范围内对他们创建的其他项目授予很少的权限。现在这是可能的,但我的解决方案似乎相当老套。硬连线自定义权限是什么意思?
-
嗨 Jeffrey,我的意思是使用
permissions元属性来定义您自己的权限,您可以检查这些权限。您提到了您发布的代码、项目和部门中不存在的其他几个模型,所以我对您的模型结构有点不清楚。但是,我想我看到了你想要完成的事情。我将使用我过去使用的设置添加答案。您能否提供一个示例列表,列出您希望为用户提供的权限/角色?
标签: django django-models django-guardian