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

Django报错Object of type leave is not JSON serializable如何解决?

问题原因

1. Object of type leave is not JSON serializable 报错

你在返回响应时要么直接返回了leave模型实例,要么序列化器对外键字段处理不当:

  • DRF 的 Response 只能序列化字典、列表等基础 Python 类型,模型实例本身无法直接转 JSON,必须经过序列化器转换为字典格式
  • 你当前的leaveSerializers没有对外键字段hostel_name做序列化配置,默认序列化时会返回关联的hostel_manager实例,也会触发序列化报错

2. JWT 查询到的用户数据无法保存

你直接合并UserSerializers(user).data和request.data的逻辑有问题:

  • 两个字典如果存在同名字段,request.data的字段会覆盖用户数据字段
  • 如果User模型的字段名和leave模型的字段名不匹配,合并后的字典会缺少leave模型需要的对应字段,导致数据无法存入

修复方案

第一步:修改序列化器配置

调整serializer.py的leaveSerializers,明确外键字段的序列化规则:

class leaveSerializers(serializers.ModelSerializer):
    # 直接返回外键关联的宿舍名称字符串,避免返回外键实例
    hostel_name = serializers.CharField(source='hostel_name.hostel', read_only=True)
    class Meta:
        model = leave
        fields = ['id','hostel_name','room_no','where_to','reason','phone_number','start_date','end_date','name','father_name','branch','coer_id']

第二步:优化视图逻辑

调整views.py的视图代码,手动映射用户字段,避免字典合并带来的问题:

class leaveview(APIView):
    def post(self,request):
        token = request.data['jwt']
        if not token:
            raise AuthenticationFailed('Unauthenticated')
        
        try:
            payload = jwt.decode(token,'secret',algorithms=['HS256'])
        except jwt.ExpiredSignatureError:
            raise AuthenticationFailed('Unauthenticated')
        
        user=User.objects.filter(id=payload['id']).first()
        # 复制请求数据,清除不需要的字段
        leave_data = request.data.copy()
        del leave_data['jwt']
        
        # 手动将用户表字段映射到leave模型对应字段,按需修改字段名匹配你的User表结构
        leave_data['name'] = user.name
        leave_data['father_name'] = user.father_name
        leave_data['branch'] = user.branch
        leave_data['coer_id'] = user.coer_id
        
        # 验证数据合法性
        serializer2 = leaveSerializers(data=leave_data)
        serializer2.is_valid(raise_exception=True)
        
        # 处理外键关联
        loc = hostel_manager.objects.get(hostel = leave_data['hostel_name'])
        del leave_data['hostel_name']
        
        # 创建leave实例
        leave_instance = leave.objects.create(**leave_data, hostel_name = loc)
        
        # 序列化后返回,必须取.data属性
        serialized_data = leaveSerializers(leave_instance)
        return Response(serialized_data.data)

内容的提问来源于stack exchange,提问作者justjokingbro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:36:01