Различные сериализаторы на основе прав пользовательских объектов
Я ищу способ использовать различные сериализаторы в ModelViewSet в зависимости от свойств request.user, выполняющих вызов.
Случай 1: Пользователь request.user является владельцем профиля и должен использовать сериализатор 'UserProfileOwnerSerializer', который позволяет частично редактировать его свойства.
Случай 2: request.user имеет полные права контроля над свойствами профилей и поэтому должен использовать 'UserProfileViewEditSerializer'
Случай 3: request.user имеет права только на чтение профилей пользователей и должен использовать 'UserProfileViewOnlySerializer', который устанавливает все поля в readonly.
Я создал 3 программы проверки разрешений, которые также используются для проверки разрешений в 'permissions.BasePermission':
def haveProfileOwnerRights(request, obj):
if (request.user.userprofile.id == obj.id):
return True
else:
return False
def haveProfileViewRights(request):
roleRightsProfileView = [
'MA',
'AM',
'ME',
'VI',
]
role = request.user.userprofile.role
if (role in roleRightsProfileView):
return True
else:
return False
def haveProfileViewEditRights(request):
roleRightsProfileViewEdit = [
'MA',
'AM',
'ME',
]
role = request.user.userprofile.role
if (role in roleRightsProfileViewEdit):
return True
else:
return False
class IsOwnerOrHaveProfileViewEditOrViewRight(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if (request.user.is_anonymous):
return False
if (haveProfileOwnerRights(request, obj)):
return True
if (haveProfileViewEditRights(request)):
return True
return False
class UserProfileViewSet(viewsets.ModelViewSet):
permission_classes = [
permissions.IsAuthenticated, IsOwnerOrHaveProfileViewEditOrViewRight
]
queryset = UserProfile.objects.all()
def get_serializer_class(self):
if haveProfileViewEditRights(self.request):
return UserProfileViewEditSerializer
if haveProfileViewRights(self.request):
return UserProfileViewOnlySerializer
#
# MISSING SERIALIZERS FOR 'UserProfileOwnerSerializer'
# I need to know here the content of the object to be serialized
#
Чтобы проверить, работает ли сериализатор, который я должен использовать для пользователей, имеющих 'haveProfileOwnerRights', я должен иметь возможность узнать содержимое объекта, чтобы передать его в качестве параметра функции 'haveProfileOwnerRights'
Как получить объект для сериализации внутри 'get_serializer_class'?
Или есть другой подход, который позволяет мне достичь того же результата, но другим способом?
Пожалуйста, спасите мой мозг :-)
Вы можете переопределить get_serializer()
. Он должен получить instance
в качестве первого аргумента.
class UserProfileViewSet(viewsets.ModelViewSet):
def get_serializer(self, instance=None, *args, **kwargs):
if instance.type == "xxx":
serializer_class = # set it depending on your conditions
else:
serializer_class = self.get_serializer_class()
kwargs.setdefault('context', self.get_serializer_context())
return serializer_class(instance, *args, **kwargs)