我有一个从ListAPIView派生的视图,具有以下权限:
permission_classes = (permissions.IsAuthenticated, IsOwnerOrSuperuser, )
IsOwnerOrSuperuse定义如下:
class IsOwnerOrSuperuser(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj.user == request.user or request.user.is_superuser
(与教程非常相似)
现在,当普通用户查询我的视图时,它可以看到每个人的对象。是否将权限应用于列表中的每个对象?如何以最小的开销强制执行此类行为?
由于
答案 0 :(得分:5)
不,has_object_permission
不适用于列表和创建端点,只检索,更新和删除只有单个实例的地方。要过滤列表,您应使用get_queryset
过滤对象。
class BlogList(generics.ListAPIView):
serializer_class = BlogSerializer
permission_classes = (IsOwnerOrSuperuser,)
def get_queryset(self):
user = self.request.user
return Blog.objects.filter(user=user)
要应用更多权限,您需要实施.has_permission(self, request, view)
....