Как применять разные классы разрешений для разных 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)
]
}