DRF Assignment视图集POST请求报TypeError内部服务器错误排查
问题排查与解决方法
核心原因
报错出现在DRF处理异常的流程中,尝试将DeferredAttribute对象转为整数时失败。DeferredAttribute是Django模型字段的未求值状态,通常是代码中直接引用了模型类的字段对象(如Assignment.id),而非模型实例的实际字段值(如instance.id)。
排查步骤及修复方案
1. 检查自定义分页类CustomPagination
打开项目中的pagination.py,重点查看get_paginated_response方法:
- 若存在直接引用模型字段的代码(如
Assignment.id),这会返回字段对象而非实际值,触发错误。 - 修复示例:
# 错误示例 class CustomPagination(PageNumberPagination): def get_paginated_response(self, data): return Response({ 'count': self.page.paginator.count, 'next': self.get_next_link(), 'previous': self.get_previous_link(), 'results': data, 'invalid_field': Assignment.id # 直接引用模型字段对象 }) # 修复后(删除错误字段或改为基于实例的正确值) class CustomPagination(PageNumberPagination): def get_paginated_response(self, data): return Response({ 'count': self.page.paginator.count, 'next': self.get_next_link(), 'previous': self.get_previous_link(), 'results': data })
2. 检查AssignmentSerializer实现
打开assignment/serializers.py,检查序列化器定义:
- 避免在字段
source参数中直接引用模型类的字段(如source=Assignment.id),应使用字段名称字符串(如source='id')。 - 若有自定义字段,确保
to_representation方法返回实际值而非字段对象。 - 修复示例:
# 错误示例 class AssignmentSerializer(serializers.ModelSerializer): invalid_field = serializers.CharField(source=Assignment.id) class Meta: model = Assignment fields = ['id', 'name', 'invalid_field'] # 修复后(删除错误字段或修正source) class AssignmentSerializer(serializers.ModelSerializer): class Meta: model = Assignment fields = ['id', 'name', 'last_updated_by'] # 仅保留实例字段
3. 验证修复
修改完成后重新发起POST请求,确认错误消失,API正常返回创建的作业数据。
内容的提问来源于stack exchange,提问作者Vivek Kumar
相关产品推荐
相关产品推荐

