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

django rest permissions allow both IsAdmin and custom permission

我有一个 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))

如果我使用 Or 它在 运行 时间内失败并出现错误,因为“'Condition' 对象不可迭代”

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

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

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

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

自 DRF 3.9, you can use the logical bitwise operators | and & (~ was added in 3.9.2).

the docs 中所述,您只需要

    permission_classes = (permissions.IsAdminUser|IsOwner,)