Has_object_permission не работает для декоратора действий детализации?

У меня есть декоратор действия private для пользовательского представления. Я хочу, чтобы действие было доступно только для данного пользователя.

# views.py
class UserViewSet(viewsets.ModelViewSet):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer

    @action(detail=True, permission_classes=[IsSelf])
    def private(self, request, pk):
        user = get_object_or_404(get_user_model(), pk=pk)
        data = UserPrivateSerializer(user).data
        return Response(data, status=status=HTTP_200_OK)

# permissions.py
class IsSelf(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        return obj == request.user

Однако, похоже, что любой может перейти к моему действию private - даже если я явно объявлю IsSelf как False:

class IsSelf(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        # This has no effect
        return False

Что я упускаю?

FYI:
. Метод уровня экземпляра has_object_permission(...) будет вызван только в том случае, если проверки уровня представления has_permission(...) уже пройдены. Поскольку он наследуется от BasePermission, has_permission(...) уже возвращает значение True.


При вызове метода has_object_permission(...) происходит вызов метода .get_object() GenericAPIView.

class UserViewSet(viewsets.ModelViewSet):
    queryset = get_user_model().objects.all()
    serializer_class = UserSerializer

    @action(detail=True, permission_classes=[IsSelf])
    def private(self, request, *args, **kwargs):
        user = self.get_object()
        data = UserPrivateSerializer(user).data
        return Response(data, status=status.HTTP_200_OK)
Вернуться на верх