Как вызвать исключение в сериализаторе, когда request.user принадлежит другой модели?

Я использую в своем приложении пользовательскую модель User и создал две другие модели, унаследованные от нее, под названием Manager и Client, каждая из которых имеет определенные поля. С помощью DRF я пытаюсь создать две конечные точки /manager и /client, чтобы оба типа пользователей могли получить данные своего профиля.

Однако, когда менеджер GET /client его собственные данные возвращаются, потому что представление ClientDetailsView возвращает self.request.user, и этот Manager объект может быть сериализован с ClientSerializer, потому что эти две модели наследуются от User.

Мой вопрос, возможно ли проверить класс модели в сериализаторе так, чтобы ClientSerializerвызвать исключение, когда менеджер посещает конечную точку? Или более глобально, какой лучший способ решить эту проблему?

models.py

class User(AbstractBaseUser, PermissionsMixin):
    ...

class Manager(User):
    ...

class Client(User):
    ...

view.py

@permission_classes([IsManager])
class ManagerDetailsView(RetrieveAPIView):
    queryset = Manager.objects.all()
    serializer_class = ManagerSerializer

    def get_object(self):
        return self.request.user


@permission_classes([IsManager | IsClient])
class ClientDetailsView(RetrieveAPIView):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer

    def get_object(self):
        return self.request.user

serializer.py

class ManagerSerializer(serializers.ModelSerializer):
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)
    fields = serializers.JSONField(write_only=True)

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError('Passwords must match.')
        return data

    def create(self, validated_data):
        data = {
            key: value for key, value in validated_data.items()
            if key not in ('password1', 'password2')
        }
        data['password'] = validated_data['password1']
        user = self.Meta.model.objects.create_user(**data)
        return user

    class Meta:
        model = Manager
        fields = ('id', 'email', 'first_name', 'last_name', 'username', 'role', 'is_team_leader', 'password1', 'password2', 'fields')
        read_only_fields = ('id', 'first_name', 'last_name', 'role', 'is_team_leader')


class ClientSerializer(serializers.ModelSerializer):
    password1 = serializers.CharField(write_only=True)
    password2 = serializers.CharField(write_only=True)
    fields = serializers.JSONField(write_only=True)

    def validate(self, data):
        if data['password1'] != data['password2']:
            raise serializers.ValidationError('Passwords must match.')
        return data

    def create(self, validated_data):
        data = {
            key: value for key, value in validated_data.items()
            if key not in ('password1', 'password2')
        }
        data['password'] = validated_data['password1']
        user = self.Meta.model.objects.create_user(**data)
        return user

    class Meta:
        model = Client
        fields = ('id', 'email', 'first_name', 'last_name', 'username', 'is_eu_citizen', 'is_us_citizen', 'nationality', 'password1', 'password2', 'fields')
        read_only_fields = ('id', 'first_name', 'last_name', 'is_eu_citizen', 'is_us_citizen', 'nationality')
Вернуться на верх