You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:13:09