调用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
相关产品推荐
相关产品推荐

