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 “尝试获取序列化器上字段的值时出现 KeyErrorUserCreateSerializer。\n序列化器字段可能命名不正确,并且与实例上的任何属性或键不匹配dict。\n原始异常文本为:“用户名” '。”
但数据库它会创建用户成功。
全部测试成功:
您将从 中弹出所有字段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)
| 归档时间: |
|
| 查看次数: |
13716 次 |
| 最近记录: |