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
相关产品推荐
相关产品推荐

