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

lbsnaicq  于 2023-10-21  发布在  Go
关注(0)|答案(3)|浏览(146)

我有一个用户注册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/“尝试获取序列化程序UserCreateSerializer上的字段username的值时出现KeyError。\n此序列化程序字段可能命名不正确,并且与dict示例上的任何属性或键都不匹配。\n原始异常文本为:'用户名'。”
但数据库它会创建用户成功.
所有测试成功:

ubby3x7f

ubby3x7f1#

您将弹出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
v2g6jxz6

v2g6jxz62#

从方法

def create(self, validated_data):

返回创建的示例。对你来说,

return user_obj
icomxhvb

icomxhvb3#

在定义了你的类之后,你必须定义那些字段,这就是我所做的,它工作得很好。

class UserCreateSerializer(ModelSerializer):
   username = serializer.Cahrfield(max_length)

就像这样我也犯了同样的错误。我忘记设置密码了。

相关问题