Различные сериализаторы на основе прав пользовательских объектов

Я ищу способ использовать различные сериализаторы в 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) 

Вернуться на верх