我正在使用带有ModelViewSets的drf-nested-routers。一切正常,但是,资源/对象的权限检查没有被执行。
处理单个资源/未嵌套的url时,会执行权限检查。
我有什么遗失的东西吗?
class CommentViewSet(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated,
permissions.CanCreateEditViewDeleteComment]
def get_serializer_class(self, *args, **kwargs):
return CommentSerializer
def list(self, request, article_pk=None):
queryset = Comment.objects.select_related('article','user').filter(article=article_pk).prefetch_related('likes')
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, pk=None, article_pk=None):
queryset = Comment.objects.select_related('article', 'user').filter(pk=pk, article=article_pk).prefetch_related(
'likes')
comment = get_object_or_404(queryset, pk=pk)
serializer = self.get_serializer(comment)
return Response(serializer.data)
答案 0 :(得分:0)
好的,所以在浏览文档后,有一种方法可以手动调用权限检查。
如果您正在编写自己的视图并希望强制执行对象级别权限,或者在通用视图上覆盖get_object方法,那么您需要显式调用.check_object_permissions(request,obj)方法。在您检索对象的位置查看。
这是一个代码示例:
def get_object(self):
obj = get_object_or_404(self.get_queryset())
self.check_object_permissions(self.request, obj)
return obj