DRF PUT请求时自定义validate_username与update方法未触发的问题求助
DRF PUT请求时自定义validate_username与update方法未触发的问题求助
我正在做一个基于Django Rest Framework(DRF)的项目,需要在序列化器中对username字段做自定义验证,同时处理更新场景下的逻辑。我的用户模型里username字段设置了unique=True,相关代码如下:
模型代码
from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): pass
序列化器代码
from django.contrib.auth import get_user_model from rest_framework import serializers 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()
视图代码
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status 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请求更新用户资料时,CustomUserSerializer里的validate_username方法完全没被执行(print的内容根本没输出),连update方法也没触发。反而直接收到了DRF返回的错误响应:
{ "user": { "username": [ "User with this username already exists." ] } }
我怀疑是模型层面的unique=True约束直接触发了验证,跳过了我写的序列化器级别的验证逻辑。我已经尝试了以下方法,但都没有解决问题:
- 在
validate_username和update方法中添加调试打印——完全没有输出,说明方法根本没被调用 - 改用自定义的
APIView实现更新逻辑——结果和之前一样 - 反复确认视图中确实正确使用了
CustomUserProfileSerializer
想请教各位大佬,到底是什么原因导致我的自定义验证和更新方法没被触发?我该怎么调整才能让PUT请求时这些方法正常执行?
备注:内容来源于stack exchange,提问作者devKOfori
相关产品推荐
相关产品推荐

