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 обходит проверку на уровне сериализатора. Я пробовал:
- Добавление операторов печати в методы validate_username и update - они никогда не выполняются. они никогда не выполняются.
- Переход на пользовательский APIView (CustomUpdateView) - без изменений.
- Убедитесь, что CustomUserProfileSerializer правильно используется в представлении.
Что может быть причиной этой проблемы, и как я могу убедиться, что методы validate_username и update вызываются во время PUT-запроса?
Вам следует избегать вложенности CustomUserSerializer
внутри CustomUserProfileSerializer
.
Вместо этого обрабатывайте поле пользователя отдельно в методе обновления CustomUserProfileSerializer. Кроме того, перенесите логику проверки имени пользователя из CustomUserSerializer в CustomUserProfileSerializer, чтобы обеспечить правильную обработку обновлений.