Python Django DRF-通过权限限制对列表视图的访问

Python Django DRF-通过权限限制对列表视图的访问,python,django,python-3.x,permissions,django-rest-framework,Python,Django,Python 3.x,Permissions,Django Rest Framework,我有一个DRF视图集,我正在向其中添加CanViewAndEditStaff权限。我只希望某些user.access_level

我有一个DRF视图集,我正在向其中添加CanViewAndEditStaff权限。我只希望某些user.access_level<2的用户能够查看员工列表。在我的权限类中,如何区分对列表视图和获取项目视图的调用。这是我的权限类:

class CanViewAndEditStaff(permissions.BasePermission):

        def has_permission(self, request, view):

            # IF THIS IS A LIST VIEW, CHECK ACCESS LEVEL
            if ( request.user.access_level < 3 ):
                return True

            # ELSE, CONTINUE ON TO OBJECT PERMISSIONS

        def has_object_permission(self,request,view,account):

            # admin can do anything
            if ( request.user.access_level == 1 ):
                return True

            # view/edit/delete
            else:

                # users can view their own account
                if  account == request.user:
                    return True

                elif account.access_level >= request.user.access_level:
                    return True

            return False
您可以使用view.action了解这是列表还是其他内容

您可以使用view.action来了解这是列表还是其他内容。

这并不能完全解决问题,但这种技术是适用的

我在Ykh的答案上使用了一个变体,允许在显示各种不同模型的许多视图中广泛使用相同的权限类

在我的视图类中,我添加了一个属性来区分原始视图,从而允许适当的对象比较来确定权限

# views.py
class SomeView(ListAPIView):
    permission_classes = (IsPermd, )
    is_some_view = True

class SomeOtherView(RetrieveAPIView
    permission_classes = (IsPermd, )
    is_some_other_view = True

# permissions.py
class IsPermd(BasePermission):
    def has_object_permissions(self, request, view, obj):
        if hasattr(view, 'is_some_view'):
            # whatever special considerations
        if hasattr(view, 'is_some_other_view'):
            # whatever other special considerations
这感觉有点笨重,但在我找到更好的方法之前,我会坚持下去。

这并不能完全解决问题,但这种技术是适用的

我在Ykh的答案上使用了一个变体,允许在显示各种不同模型的许多视图中广泛使用相同的权限类

在我的视图类中,我添加了一个属性来区分原始视图,从而允许适当的对象比较来确定权限

# views.py
class SomeView(ListAPIView):
    permission_classes = (IsPermd, )
    is_some_view = True

class SomeOtherView(RetrieveAPIView
    permission_classes = (IsPermd, )
    is_some_other_view = True

# permissions.py
class IsPermd(BasePermission):
    def has_object_permissions(self, request, view, obj):
        if hasattr(view, 'is_some_view'):
            # whatever special considerations
        if hasattr(view, 'is_some_other_view'):
            # whatever other special considerations

这感觉有点笨拙,但在我找到更好的方法之前,我会坚持使用它。

如果他使用GenericViewSet或其子类进行查看,那么self.action可以用来区分不同的查看方法。否则,他必须使用request.method来区分请求方法对于那些古玩,可用的操作是创建、检索、更新、部分更新、销毁和列表如果他使用GenericViewSet或其子类进行查看,那么self.action可以用于区分查看方法。另外,他必须使用request.method来区分请求方法对于那些古玩,可用的操作是创建、检索、更新、部分更新、销毁和列出