You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:17:38