扩展django组和权限

Tho*_*rzl 9 django django-models django-permissions

我过去3天一直在搜索谷歌和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)
Run Code Online (Sandbox Code Playgroud)

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

那么,让我们将团队模型改为

class Team(Group):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)
Run Code Online (Sandbox Code Playgroud)

这扩展了现有的集团.在namepermissions现场来自直接从集团模式.如果我创建一个新团队,也会添加一个团队.那很棒.

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

现在我的问题是,该name字段是唯一的 - 所以我无法为每个项目添加Admins -Team.

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

Roh*_*han 6

您需要使组名称具有唯一性。因此,您发现的一种方法是使用另一个名称字段,使其对于所有子组都是唯一的。

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

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

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

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