在Django中设置“工作区”权限的正确方法是什么?

3
我正在尝试创建一个网站,让用户在“工作区”中共同协作。 工作区类似于一组用户的帐户。
每个工作区将有多个用户。 有两个用户组:“超级用户”和“普通用户”。
用户可能是多个工作区的成员。 用户永远不能同时属于同一工作区中的两个用户组,但用户可以在一个工作区中是“超级用户”,在另一个工作区中是“普通用户”。
我正在尝试确定是否可以使用Django的开箱即用权限框架创建此类设置,或者最好的解决方案是创建自己的支持表格?
我的解决方案将是这样的数据模型:
#(assume default User model)

class Workspace(models.Model):
    workspace_name = models.CharField(max_length=100)

class WorkspaceUser(models.Model):
    user = models.ForeignKey(User)
    workspace = models.ForeignKey(Workspace)
    usertype = models.CharField(max_length=100) #for simplicity, would only have two options

这是一个明智的做法吗?还是我可以利用现成的框架来实现同样的功能?
1个回答

2
不,内置的权限框架仅适用于模型级别——即“用户通常可以修改工作区”,而不是“用户可以修改此特定工作区”。
你的解决方案看起来很合理。一个补充是添加一个明确的多对多声明,使用WorkspaceUser作为中间表:
class Workspace(models.Model):
    workspace_name = models.CharField(max_length=100)
    users = models.ManyToManyField(User, through='WorkspaceUser')

这不会改变表结构,但可以让你通过my_user.workspace_set.all()获取用户的所有工作区或者通过my_workspace.users.all()获取工作区的所有用户。最初的回答。

非常感谢。跟进:当我在views.py中使用my_user.workspace_set.all()获取用户的帐户时,如何通过多对多关系“一路上”获取WorkspaceUser的用户类型?目标是在我的模板中向我的“超级用户”显示一种内容,而向我的“普通用户”显示另一种内容。我是否使用我的帐户在request.user.account_set.all()变量中创建一个帐户和权限字典? - Morten
1
是的,这些实用方法不允许您访问“through”表,您仍然必须直接访问。像request.user.workspaceuser_set.filter(workspace=my_workspace, usertype='super').exists()或其他类似的方式。 - Daniel Roseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接