“尝试在序列化程序 UserCreateSerializer 上获取字段 username 的值时出现 KeyError
"Got KeyError when attempting to get a value for field `username` on serializer `UserCreateSerializer`
我有一个用户注册了APIView。
查看:
class UserCreateAPIView(CreateAPIView):
serializer_class = UserCreateSerializer
permission_classes = [AllowAny]
queryset = User.objects.all()
序列化器:
class UserCreateSerializer(ModelSerializer):
"""
User register
"""
class Meta:
model = User
fields = [
'username',
'wechat_num',
'password',
]
extra_kwargs = {
"password":{"write_only":True}
}
def create(self, validated_data):
username=validated_data.pop('username')
wechat_num = validated_data.pop('wechat_num')
password=validated_data.pop('password')
user_obj = User(
username=username,
wechat_num=wechat_num,
)
user_obj.set_password(password)
user_obj.save()
group=getOrCreateGroupByName(USER_GROUP_CHOICES.User)
user_obj.groups.add(group)
return validated_data
当我访问这个 APIView 时,我会得到错误:
KeyError at /api/users/register/
"Got KeyError when attempting to get a value for field username
on serializer UserCreateSerializer
.\nThe serializer field might be named incorrectly and not match any attribute or key on the dict
instance.\nOriginal exception text was: 'username'."
但是数据库它会创建用户成功。
全部测试成功:
您正在弹出 validated_data
中的所有字段,因此当您最终 return 它时它们不会出现在字典中。
username=validated_data.pop('username')
wechat_num = validated_data.pop('wechat_num')
password=validated_data.pop('password')
...
return validated_data
也许您想将其更改为:
username=validated_data['username']
wechat_num = validated_data['wechat_num']
password=validated_data.pop('password')
...
return validated_data
定义 class 之后,您必须定义那些字段,我所做的工作正常。
class 用户创建序列化器(模型序列化器):
用户名 = serializer.Cahrfield(max_length)
像这样你必须这样做。
在我的我有同样的错误。
我忘了定义密码。
来自方法
def create(self, validated_data):
您应该 return 创建的实例。在你的情况下,它应该是
return user_obj
我有一个用户注册了APIView。
查看:
class UserCreateAPIView(CreateAPIView):
serializer_class = UserCreateSerializer
permission_classes = [AllowAny]
queryset = User.objects.all()
序列化器:
class UserCreateSerializer(ModelSerializer):
"""
User register
"""
class Meta:
model = User
fields = [
'username',
'wechat_num',
'password',
]
extra_kwargs = {
"password":{"write_only":True}
}
def create(self, validated_data):
username=validated_data.pop('username')
wechat_num = validated_data.pop('wechat_num')
password=validated_data.pop('password')
user_obj = User(
username=username,
wechat_num=wechat_num,
)
user_obj.set_password(password)
user_obj.save()
group=getOrCreateGroupByName(USER_GROUP_CHOICES.User)
user_obj.groups.add(group)
return validated_data
当我访问这个 APIView 时,我会得到错误:
KeyError at /api/users/register/ "Got KeyError when attempting to get a value for field
username
on serializerUserCreateSerializer
.\nThe serializer field might be named incorrectly and not match any attribute or key on thedict
instance.\nOriginal exception text was: 'username'."
但是数据库它会创建用户成功。
全部测试成功:
您正在弹出 validated_data
中的所有字段,因此当您最终 return 它时它们不会出现在字典中。
username=validated_data.pop('username')
wechat_num = validated_data.pop('wechat_num')
password=validated_data.pop('password')
...
return validated_data
也许您想将其更改为:
username=validated_data['username']
wechat_num = validated_data['wechat_num']
password=validated_data.pop('password')
...
return validated_data
定义 class 之后,您必须定义那些字段,我所做的工作正常。 class 用户创建序列化器(模型序列化器): 用户名 = serializer.Cahrfield(max_length)
像这样你必须这样做。 在我的我有同样的错误。 我忘了定义密码。
来自方法
def create(self, validated_data):
您应该 return 创建的实例。在你的情况下,它应该是
return user_obj