django rest权限允许IsAdmin和自定义权限

时间:2017-08-08 08:30:00

标签: django django-rest-framework django-authentication

我有一个views.py,如下所示,

from webapi.permissions import IsOwner

class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (permissions.IsAdminUser,IsOwner)

以下是自定义权限,以检查用户是否是webapi.permissions中的对象的权力,

class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
            return obj.owner == request.user

现在的问题是检查他是否是管理员用户并授予更新/删除权限,但如果所有者是用户,则实际上应该授予编辑数据的权限,但在这种情况下它是失败的。

看到问题" Django Rest Framework won't let me have more than one permission"我尝试如下,当我使用Or时,它仍然不起作用,

class MemberDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = members.objects.all()
    serializer_class = MemberSerializer
    permission_classes = (Or(permissions.IsAdminUser,IsOwner))

如果我使用或者它在运行时失败并且错误,那么"'条件'对象不可迭代"

3 个答案:

答案 0 :(得分:3)

如果您只需要为管理员和所有者用户授予编辑权限,则可以实现自定义权限类:

class IsOwnerOrAdmin(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user or request.user.is_admin

在视图中只使用这个:

permission_classes = [IsOwnerOrAdmin]

此方法记录在案here

答案 1 :(得分:2)

您正在使用元组语法,但您需要使用逗号作为元组 更换
permission_classes = (Or(permissions.IsAdminUser,IsOwner))

permission_classes = (Or(permissions.IsAdminUser,IsOwner), )

答案 2 :(得分:1)

自从DRF 3.9开始,您就可以使用逻辑按位运算符|&3.9.2中添加了~)。

the docs中概述了,您只需要

    permission_classes = (permissions.IsAdminUser|IsOwner,)