Django Rest Framework: методы validate_username и update не вызываются во время PUT-запроса

Я работаю над проектом Django Rest Framework (DRF), где мне нужно проверить поле имени пользователя и обработать пользовательскую логику обновления в сериализаторе. В моей модели есть поле имени пользователя с unique=True. Вот соответствующая настройка:

Модель:


from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    pass

Сериализатор:

class CustomUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.CustomUser
        fields = ["id", "username", "first_name", "last_name"]
        read_only_field = ["id"]
        extra_kwargs = {
            "password": {"write_only": True},
        }

    def validate_username(self, value):
        print('here.......')
        user_model = get_user_model()
        request = self.context.get('request')  
        if request and request.method in ['PUT', 'PATCH']:
            
            if user_model.objects.filter(username=value).exclude(id=self.instance.id).exists():
                raise serializers.ValidationError('User with this username already exists.')
        else:
            if user_model.objects.filter(username=value).exists():
                raise serializers.ValidationError('User with this username already exists.')
        return value


class CustomUserProfileSerializer(serializers.ModelSerializer):
    user = CustomUserSerializer()
    roles = ProfileRolesSerializer(many=True)
    department = DepartmentSerializer()
    gender = GenderSerializer()

Просмотры:


class CustomUpdateView(APIView):
    def put(self, request, *args, **kwargs):
        serializer = CustomUserProfileSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Когда я отправляю PUT-запрос на обновление профиля пользователя, методы validate_username и update в сериализаторе не выполняются. Вместо этого я получаю ошибку в ответе:

{
    "user": {
        "username": [
            "User with this username already exists."
        ]
    }
}

Подозреваю, что ограничение по умолчанию unique=True на поле username обходит проверку на уровне сериализатора. Я пробовал:

  1. Добавление операторов печати в методы validate_username и update - они никогда не выполняются. они никогда не выполняются.
  2. Переход на пользовательский APIView (CustomUpdateView) - без изменений.
  3. Убедитесь, что CustomUserProfileSerializer правильно используется в представлении.

Что может быть причиной этой проблемы, и как я могу убедиться, что методы validate_username и update вызываются во время PUT-запроса?

Вам следует избегать вложенности CustomUserSerializer внутри CustomUserProfileSerializer.

Вместо этого обрабатывайте поле пользователя отдельно в методе обновления CustomUserProfileSerializer. Кроме того, перенесите логику проверки имени пользователя из CustomUserSerializer в CustomUserProfileSerializer, чтобы обеспечить правильную обработку обновлений.

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