使用drf-spectacular的PolymorphicProxySerializer加载Schema时遇参数错误
解决PolymorphicProxySerializer的context参数错误问题
出现PolymorphicProxySerializer.__init__() got an unexpected keyword argument 'context'错误,是因为旧版本drf-spectacular的PolymorphicProxySerializer构造函数未处理context参数,但DRF视图序列化时会自动传递该参数,导致参数不匹配。以下是两种可行的解决方法:
方法一:升级drf-spectacular到最新版本
这是最直接的方案,新版本已修复该问题,支持context参数传递。执行命令升级:
pip install --upgrade drf-spectacular
方法二:自定义支持context的PolymorphicProxySerializer子类
若无法升级依赖,可创建兼容context的自定义序列化器,重写构造方法与序列化器获取逻辑:
from drf_spectacular.serializers import PolymorphicProxySerializer class ContextAwarePolymorphicProxySerializer(PolymorphicProxySerializer): def __init__(self, *args, context=None, **kwargs): super().__init__(*args, **kwargs) self.context = context or {} def get_serializer(self, *args, **kwargs): # 将context传递给子序列化器 kwargs['context'] = self.context return super().get_serializer(*args, **kwargs)
在视图中替换原PolymorphicProxySerializer为该自定义类:
@extend_schema( parameters=[NoteQueryParameters], responses=ContextAwarePolymorphicProxySerializer( component_name="NoteSerializer", serializers=[NoteSerializer, NoteSerializerWithJiraData], resource_type_field_name=None, ), ) def list(self, request, *args, **kwargs): return super().list(request, *args, **kwargs)
补充:确保视图正确切换序列化器
为让API文档与实际响应匹配,需在视图中根据查询参数切换序列化器,重写get_serializer_class方法:
def get_serializer_class(self): # 根据实际查询参数名调整,示例参数为include_jira_data if self.request.query_params.get('include_jira_data') == 'true': return NoteSerializerWithJiraData return NoteSerializer
内容的提问来源于stack exchange,提问作者Austin Hallett
相关产品推荐
相关产品推荐

