“尝试在序列化器“UserCreateSerializer”上获取字段“用户名”的值时出现 KeyError

244*_*boy 4 python django django-rest-framework django-allauth

我有一个用户注册 APIView。

看法:

class UserCreateAPIView(CreateAPIView):
    serializer_class = UserCreateSerializer
    permission_classes = [AllowAny]
    queryset = User.objects.all()
Run Code Online (Sandbox Code Playgroud)

序列化器:

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
Run Code Online (Sandbox Code Playgroud)

当我访问这个 APIView 时,我会收到错误:

username/api/users/register/ 处的 KeyError “尝试获取序列化器上字段的值时出现 KeyError UserCreateSerializer。\n序列化器字段可能命名不正确,并且与实例上的任何属性或键不匹配dict。\n原始异常文本为:“用户名” '。”

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

全部测试成功:

在此输入图像描述

Ala*_*air 6

您将从 中弹出所有字段validated_data,因此当您最终返回它时它们不会出现在字典中。

username=validated_data.pop('username')
wechat_num = validated_data.pop('wechat_num')
password=validated_data.pop('password')
...

return validated_data
Run Code Online (Sandbox Code Playgroud)

也许您想将其更改为:

username=validated_data['username']
wechat_num = validated_data['wechat_num']
password=validated_data.pop('password')
...
return validated_data
Run Code Online (Sandbox Code Playgroud)