Как вызвать исключение в сериализаторе, когда 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')