Как применять разные классы разрешений для разных http-запросов

У меня есть UserViewSet, который поддерживает HTTP-запросы get, post, patch и delete. У меня есть администраторы с разными ролями, некоторые из них могут удалять пользователей, а другие нет.

Я хочу отредактировать свой UserViewSet для поддержки этой функции.

Я пытался сделать что-то вроде этого:

class UserViewSet(ModelViewSet):
    queryset = User.objects.all()
    http_method_names = ['get', 'post', 'patch', 'delete']

    def get_serializer_class(self):
        if self.request.method == 'PATCH':
            self.permission_classes = [CanEdit]
            return UpdateUserSerializer
        elif self.request.method == 'DELETE':
            self.permission_classes = [CanDelete]
        return UserSerializer

Я не уверен, что это лучшая практика для этого.

Вы можете либо изменить метод get_permissions, что является общим способом сделать это :

    def get_permission_classes(self):
    if self.action in ['retrieve', 'update', 'partial_update']:
        return [(IsAuthenticated & IsSelf) | IsAdminUser]

или использовать расширение DRF для использования в качестве общего представления конфигурации, которое объединяет сериализатор и разрешения : https://github.com/drf-psq/drf-psq

    psq_rules = {
    ('retrieve', 'update', 'partial_update'): [
        Rule([IsAdminUser], UserFullSerializer),
        Rule([IsAuthenticated & IsSelf], UserBasicSerializer)
    ]
}
Вернуться на верх