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

调用UserSerializer获取当前用户时触发username字段KeyError,求排查

问题分析与解决:获取当前用户时的username KeyError

错误原因

你在current_user视图犯了一个关键错误:将request.data传给了UserSerializer,但这是GET请求,request.data是空字典。而UserSerializer需要序列化的是用户实例,不是请求数据——由于你已经添加了IsAuthenticated权限装饰器,当前登录用户的实例应该从request.user获取,而非request.data。

当序列化器试图从空的request.data中读取username字段时,自然会抛出KeyError。

修正后的代码

把current_user视图修改为:

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def current_user(request):
    user = UserSerializer(request.user)
    print(user)
    return Response(user.data)

额外优化建议(非当前错误必需)

你的register视图可以利用SignUpSerializer的save()方法简化逻辑,避免手动创建User实例的重复代码:

@api_view(['POST'])
def register(request):
    serializer = SignUpSerializer(data=request.data)
    if serializer.is_valid():
        email = serializer.validated_data['email']
        if not User.objects.filter(username=email).exists():
            # 重写create方法来处理username和密码加密
            user = serializer.save(username=email, password=make_password(serializer.validated_data['password']))
            return Response({'details':'Successfully registered.'}, status.HTTP_201_CREATED)
        else:
            return Response({'error':'User already exists.'}, status.HTTP_400_BAD_REQUEST)
    else:
        return Response(serializer.errors)

同时需要在SignUpSerializer中添加create方法:

class SignUpSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email', 'password')
        extra_kwargs = {
            'first_name':{'required':True, 'allow_blank':False},
            'last_name':{'required':True, 'allow_blank':False},
            'email':{'required':True, 'allow_blank':False},
            'password':{'required':True, 'allow_blank':False, 'min_length':4}
        }
    
    def create(self, validated_data):
        username = validated_data.pop('username')
        password = validated_data.pop('password')
        user = User.objects.create(username=username, **validated_data)
        user.set_password(password)
        user.save()
        return user

内容的提问来源于stack exchange,提问作者Rohit Gajula

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:30:19