Django REST使用无模型Serializer报BoundField类型TypeError问题咨询
问题修复说明
1. BoundField 类型错误修复
错误原因
错误由两个错误用法共同导致:
- 初始化序列化器时没有显式传入
data关键字参数:ExamSimulatorSerializer(request.data)默认把传入的请求数据当做待序列化的模型实例处理,不会触发反序列化解析逻辑 - 直接通过
序列化器实例[字段名]取值,拿到的是DRF的BoundField字段对象,不是请求传入的实际值
修复方案
严格遵循DRF序列化器反序列化的标准流程:初始化时显式传data参数 → 调用is_valid()校验参数 → 从validated_data属性取校验后的合法值,同时补充参数校验失败的处理逻辑,修复后的视图代码如下:
@api_view(['POST']) @parser_classes([JSONParser]) def examSimulator(request): # 显式传入data关键字参数,触发反序列化逻辑 m = ExamSimulatorSerializer(data=request.data) # 新增参数校验逻辑,校验失败直接返回400错误 if not m.is_valid(): return Response(m.errors, status=status.HTTP_400_BAD_REQUEST) # 从validated_data取的值已经和序列化器定义的类型匹配,week为int类型 validated_data = m.validated_data code = validated_data['code'] date = fridayOfWeek(validated_data['week']) subject = Subject.objects.get(name = validated_data['subject']) for s in subject.students.all().values(): student = Student.objects.get(roll_num=s['roll_num']) score = random.randint(25,95) Exam.objects.create(code=code, date=date, student=student, subject=subject,score=score) # 原代码return写在循环内部,会导致只处理第一个学生就返回,此处移到循环外 return Response(status=status.HTTP_200_OK)
2. 无模型Serializer实现正确性说明
你的无模型Serializer实现完全符合DRF规范:
- 当仅需要用序列化器做请求参数的校验、类型转换,不需要绑定ORM模型做增改操作时,直接继承
serializers.Serializer定义字段即可 - 空的
create方法可保留也可删除,你没有调用serializer.save()的需求,不会触发该方法执行,如果后续没有使用save的计划,直接删除空实现代码更简洁。
3. fridayOfWeek 函数优化建议
你当前计算周五的逻辑可以简化,不需要使用小数的timedelta,周一加4天就是当周周五,修改后逻辑更清晰易读:
import datetime def fridayOfWeek(p_week): p_year=2021 monday = datetime.datetime.strptime(f'{p_year}-W{int(p_week)-1}-1', "%Y-W%W-%w").date() friday = monday + datetime.timedelta(days=4) return friday
内容的提问来源于stack exchange,提问作者KHAN
相关产品推荐
相关产品推荐

