在 Django REST Framework (DRF) 中,自定义序列化器字段时,出现TypeError: Field.__init__() got an unexpected keyword argument 'request'。该错误通常发生在get_serializer方法错误地处理了参数,导致request作为不合法的关键字参数传递给序列化器。
解决方案1
为了避免该错误,需要检查get_serializer方法的实现,确保request参数不会被直接传递,而是正确放入context中。get_serializer方法的正确实现方式如下:
# dvadmin/utils/viewset.pyclassCustomModelViewSet(viewsets.ModelViewSet):defget_serializer(self,*args,**kwargs):# 确保 request 仅作为 context 传递serializer_class=self.get_serializer_class()kwargs['context']=self.get_serializer_context()# 确保 context 正确设置returnserializer_class(*args,**kwargs)在get_serializer_context方法中,默认情况下request应该包含在返回的context中,但如果有自定义修改,应该确保context仍然正确地返回request。
# dvadmin/utils/viewset.pyclassCustomModelViewSet(viewsets.ModelViewSet):defget_serializer_context(self):# 返回包含请求和其他上下文信息的字典context=super().get_serializer_context()returncontext此外在视图集中调用get_serializer方法时,也需要确保不会错误地传递request参数。例如,在list方法中,正确的调用方式如下:
# dvadmin/utils/viewset.pyclassCustomModelViewSet(viewsets.ModelViewSet):deflist(self,request,*args,**kwargs):queryset=self.filter_queryset(self.get_queryset())page=self.paginate_queryset(queryset)ifpageisnotNone:serializer=self.get_serializer(page,many=True)# 仅传递查询数据returnself.get_paginated_response(serializer.data)serializer=self.get_serializer(queryset,many=True)returnResponse(serializer.data)解决方案2
如果不能修改CustomModelViewSet的get_serializer方法,可以在具体视图集中重写get_serializer方法,确保在调用父类get_serializer方法时移除request参数。这样可以局部修复该问题,而不会影响其他视图集。
fromrest_framework.responseimportResponsefrom.modelsimportExaminationAnalyzeBasicDescriptionfrom.serializersimportExaminationAnalyzeBasicDescriptionSerializerfromdvadmin.utils.viewsetimportCustomModelViewSetclassExaminationAnalyzeBasicDescriptionViewSet(CustomModelViewSet):""" 考试成绩基本信息 """queryset=ExaminationAnalyzeBasicDescription.objects.filter(is_deleted=0)serializer_class=ExaminationAnalyzeBasicDescriptionSerializerdefget_serializer(self,*args,**kwargs):# 安全移除 request 参数,避免传递给 DRF 序列化器kwargs.pop('request',None)returnsuper().get_serializer(*args,**kwargs)执行 API 端点后,错误TypeError: Field.__init__() got an unexpected keyword argument 'request'不再发生,序列化器能够正确解析数据,并返回期望的 JSON 结果。
该错误的根本原因是request作为不合法参数被传递给序列化器。正确的做法是在context中传递request,或在get_serializer方法中安全地移除不必要的参数。通过修正get_serializer或在具体视图集中重写get_serializer,可以有效避免该错误,并确保 DRF 序列化器的正常工作。