“在序列化程序`UserCreateSerializer`上尝试获取字段`username`的值时出现KeyError

时间:2018-03-14 11:10:09

标签: python django django-rest-framework allauth

我有一个用户注册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'。“

但数据库会创建用户成功。

所有测试成功:

enter image description here

2 个答案:

答案 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)

像这样你必须这样做。 在我的我有同样的错误。 我忘了定义密码。