django - 扩展django组和权限

标签 django django-models django-permissions

我最近三天一直在搜索Google和Stackoverflow,找不到类似的东西。我想扩展或使用Django组和权限。

假设我们有一些具有不同团队和用户的项目。

class Project(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField(max_length=100)

class Team(models.Model):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)
    name = models.CharField(max_length=100)
    permission = models.ManyToManyField(Permission)

现在-一切都很好。现在,我想要的是扩展django提供的现有Auth.Group,以便我可以直接使用request.user.has_perm...

因此,我们将团队模型更改为
class Team(Group):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)

这扩展了现有的组。 namepermissions字段直接来自组模型。如果我创建一个新团队,那么也会添加一个组。那太棒了。

使用自定义的save方法,我还可以添加user中列出的members,将其添加到创建的组中并获得授予团队/组的权限。

现在我的问题是,该组的name字段是唯一的-因此我无法为每个项目添加一个管理员团队。

我考虑过为前端添加另一个名称字段,并为组模型的名称字段生成一个唯一的字符串。但是hmmm ....对于多个自定义组是否有更好的解决方案?也许有人有主意?先感谢您!

最佳答案

您需要使组名唯一。因此,您发现的一种方法是拥有另一个名称字段,从而使其在所有子组中都是唯一的。

另一种方法是利用现有名称字段并添加您的特殊字符。例如带有admin#project1members#project1等的组名。(注意:我不确定组名中是否允许使用“#”,您可以选择允许的任何特殊字符)。

因此,每当创建Team时,就在#<project_name>模型Team方法中使用后缀save()更新名称字段。

为了更合理地显示它,可以添加__unicode__()方法以仅返回组名的第一部分。例子:

class Team(Group):
    ...
    def __unicode__(self):
        try:
            return self.name.split('#')[0]
        except:
            #something wrong!
            return self.name

关于django - 扩展django组和权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12892907/

相关文章:

python - Django:使用模型继承时如何检查对象类别?

mysql - 无法将外键从一种模型迁移到另一种模型

sql - 关于 Django 中的嵌套集合和查询效率的问题

django - 在 Django 中添加新的自定义权限

python - 计时 Django 数据库查询

python - 如何从 django 查询集中检索项目?

python - Django - 如何给 URL 一个变量

python - Django 模型字段的默认值可以由依赖于外部父模型的函数定义吗?

python - Django - 能够在管理控制台中为自定义用户模型分配权限和组

django - 在 Django REST framework 中注册用户并为用户设置组