我是相当新的django休息框架,我对权限有一些疑问。
所以我有一个用户是组织的成员和某个组的成员。 让我们说我们有一个模型:
class SomeModel:
organization = models.ForeignKey(Organization)
name = models.CharField()
对于自己的组织,用户只能create
/ update
SomeModel
,如果他是“协调员”组,他也可以create
/ update
任何组织。
目前,我的方法是使用.create()
和.update()
方法检查序列化程序中的这些条件,因为数据已经过验证,我在那里引发PermissionDenied
错误。但感觉这不是“正确的方式”。我尝试制作自定义权限类,但之后数据未经过验证,因为在序列化程序之前会检查权限类。
您有什么建议我应该怎么做?
抱歉英语不好,这不是我的母语。 谢谢!
修改 例: 请求数据类似于:
payload = {'organization': 1, 'name': 'Name'}
因此,如果用户来自组织1,或者他是协调员,则应授予访问权限,并且应创建SomeModel
答案 0 :(得分:5)
您可以编写自定义权限类HasWritePermissions
,这将检查用户是否具有写入/更新权限。
要创建custom permission class,您需要覆盖BasePermission
类并实施has_permission()
方法。如果请求被授予访问权限,则此方法应返回True
,否则返回False
。
class HasWritePermissions(BasePermission):
def has_permission(self, request, view):
# grant access to non-create/update requests
if request.method not in ['POST', 'PUT', 'PATCH']:
return True
# grant access if user is a member of organization of the object
# to be modified or is a coordinator
if (organization in user.organizations) or (user_is_a_coordinator):
return True
# Otherwise don't grant access
return False