Django注册调用API时Object of type data无法JSON序列化错误求助
解决Django中Date对象无法JSON序列化的问题
看起来你遇到的核心问题是**datetime.date对象不能直接被JSON序列化**,加上代码里还有几个小坑,我来一步步帮你修复:
1. 根本原因:Date对象无法JSON序列化
当你从register_form.cleaned_data.get('dob')获取到值时,它返回的是一个datetime.date实例,而Python的JSON序列化器默认不支持这种类型。当你把这个对象放进payload并用requests.post(..., json=payload)发送请求时,就会抛出序列化错误。
修复方法:把Date对象转成字符串
直接用isoformat()方法把日期对象转成YYYY-MM-DD格式的字符串(和你的模板输入格式一致):
# 在signup视图中修改birthday的赋值 birthday = register_form.cleaned_data.get('dob').isoformat() # 或者用str()也可以,因为date对象的字符串表示就是YYYY-MM-DD # birthday = str(register_form.cleaned_data.get('dob'))
2. 修正Payload中的字段名不匹配问题
你的UserSerializer里定义的关联Profile的字段是profile,但你在payload里写的是register,这会导致序列化器找不到对应的Profile数据,进而验证失败。修改payload的键名:
payload = { 'username': username, 'first_name': first_name, 'last_name': last_name, 'email': email, 'password': password, 'profile': {'birthday': birthday, 'address': address} # 把register改成profile }
3. 修复UserSerializer的create方法错误
你的create方法有两个问题:
- 方法签名错误:第一个参数不应该是
request,应该是validated_data - 返回值错误:应该返回创建的User实例,而不是
validated_data
修正后的代码:
class UserSerializer(serializers.ModelSerializer): profile = ProfileSerializer() class Meta: model = User fields = ('username','first_name','last_name','email', 'password', 'profile') def create(self, validated_data, *args, **kwargs): register_data = validated_data.pop('profile') password = validated_data.pop('password', None) user = User.objects.create(**validated_data) if password is not None: user.set_password(password) user.save() Profile.objects.create(user=user, **register_data) return user # 返回创建的User实例
4. 去掉变量后的多余逗号
在signup视图里,你给每个变量赋值后都加了逗号,比如:
username = user_form.cleaned_data.get('username'),
这会把变量变成单元素元组(比如('your_username',)),虽然JSON能序列化元组,但传给API的格式会不符合预期,所以要去掉这些逗号:
username = user_form.cleaned_data.get('username') first_name = user_form.cleaned_data.get('first_name') last_name = user_form.cleaned_data.get('last_name') email = user_form.cleaned_data.get('email') password = user_form.cleaned_data.get('password2') birthday = register_form.cleaned_data.get('dob').isoformat() address = register_form.cleaned_data.get('address')
把这些修改都做完后,你的代码应该就能正常运行,不再出现序列化错误了。
内容的提问来源于stack exchange,提问作者retro_coder
相关产品推荐
相关产品推荐

