gpt4 book ai didi

django - 使用 Django 和 django-guardian 对象权限按对象分组

转载 作者:行者123 更新时间:2023-12-04 01:13:30 34 4
gpt4 key购买 nike

我目前正在创建一个结构,其中我的员工属于一家公司。
在这家公司内,我需要能够创建多个组。排名,如果你愿意。您可以为较低的等级分配较少的权限,而为较高的等级分配更多的权限。

我想获得对象级别的权限,我注意到 django-guardian 项目正是我需要的。它适用于 native User 和 Group 对象,所以我现在试图找到一种方法来在公司对象中实现 native 组对象。

我面临的问题是组中的名称是唯一的。所以如果2家公司添加同一个组,就会出现错误。

我发现了一个在某种程度上起作用的实现,但对我来说似乎很“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、哈希符号和实际组名称的组合以避免冲突。

现在我的问题是:在我的场景中是否有更好的方法,我是否遗漏了什么或者这是完成我需要的好方法?

最佳答案

不幸的是,没有办法绕过这个独特的要求,这是因为这个字段被用作 id:
https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.unique

您的选择如下:

1)模拟模型。

您基本上只需创建一个没有独特要求的新组模型。这里的缺点是你需要在任何地方使用它,所以如果这需要更新 3rd 方应用程序,它可能不值得。

2)让你的名字独一无二。 (正如你所做的那样)

确保你很好地记录你的约定,以便所有 future 的编码人员都知道他们在看什么。像“公司名称”#“组名称”这样的东西比 ID 更直观。如果哈希可能出现在任何一个中,则使用更确定的分隔符(“__”是在 django 中连接相关概念的一种相对常见的方式,我可能会这样做)。

我建议您添加以下内容,以便您轻松访问该名称。

def get_name(self):
# Explain how you get the group name from your uniqueified name
return self.name.split('#')[1]

Group.add_to_class('get_name', get_name)

当您在应用中访问群组名称时,只需执行以下操作:
my_group.get_name()

您可能还想将生成的唯一名称放入 save() 的覆盖版本中。这会给你更好的模型和 View 之间的分割......

关于django - 使用 Django 和 django-guardian 对象权限按对象分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23460057/

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