我有一个用户注册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时,我将收到错误:
/ api / users / register /中的KeyError “在序列化程序
username
上尝试获取字段UserCreateSerializer
的值时出现KeyError。\ n序列化程序字段可能名称不正确,并且与dict
实例上的任何属性或键都不匹配。\ nOriginal异常文本是:'username'。“
但数据库会创建用户成功。
所有测试成功:
答案 0 :(得分:0)
您正在弹出validated_data
中的所有字段,因此当您最终返回时,它们不会出现在字典中。
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
答案 1 :(得分:0)
在定义您的类后,您必须定义这些字段,即我所做的并且效果很好。 类 UserCreateSerializer(ModelSerializer): 用户名 = serializer.Cahrfield(max_length)
像这样你必须这样做。 在我的我有同样的错误。 我忘了定义密码。