10

过去 3 天我一直在搜索 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...直接方式。

因此,让我们将Team-Model更改为

class Team(Group):
    project = models.ForeignKey(Project)
    members = models.ManyToManyField(User)

这扩展了现有的集团。nameandpermissions字段直接来自Group -Model。如果我创建一个新Team,也会添加一个Group。那太棒了。

使用我还可以添加的自定义save方法,usermembers添加到创建的Group中,并获得授予Team/Group的权限。

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

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

4

1 回答 1

5

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

另一种方法是利用现有的名称字段并添加您的特殊字符。例如带有 等的组名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
于 2012-10-15T10:09:32.600 回答