You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:54:52