drf-spectacular中PresentablePrimaryKeyRelatedFieldSchema扩展未生效求助
问题描述
我是drf-spectacular的新手,我的序列化器中使用了第三方字段PresentablePrimaryKeyRelatedField,代码如下:
class DummySerializer(serializers.Serializer): dummy_field = PresentablePrimaryKeyRelatedField( queryset=DummyModel.objects, presentation_serializer=SomeOtherSerializer, read_source=None, )
我希望该字段在drf-spectacular文档中正确展示:请求时接收整数值,响应时返回完整模型字段的字典形式。我从drf-spectacular文档中获取了以下扩展代码:
class PresentablePrimaryKeyRelatedFieldSchema(OpenApiSerializerFieldExtension): target_class = PresentablePrimaryKeyRelatedField def map_serializer_field(self, auto_schema: AutoSchema, direction: Direction): if direction == 'request': return build_basic_type(OpenApiTypes.INT) meta = auto_schema._get_serializer_field_meta(self.target, direction) schema = auto_schema.resolve_serializer( self.target.presentation_serializer( context=self.target.context, **self.target.presentation_serializer_kwargs, ), direction, ).ref return append_meta(schema, meta)
我将其复制到project/schema.py文件中,并在project/__init__.py中进行导入:
import django django.setup() from web.emt_rails import schema
但重新运行Redoc文档后,问题依旧,该扩展似乎未注册成功。请问我遗漏了哪些步骤?
可能遗漏的步骤
- 手动指定扩展路径:如果
project不是Django注册的app,drf-spectacular不会自动扫描根目录下的schema.py。需要在settings.py的SPECTACULAR_SETTINGS里添加扩展的完整路径:SPECTACULAR_SETTINGS = { # 保留原有配置... 'SERIALIZER_FIELD_EXTENSIONS': [ 'project.schema.PresentablePrimaryKeyRelatedFieldSchema', ], } - 修正导入时机:移除
project/__init__.py里的django.setup()和导入代码,这会打乱Django的初始化顺序。要么把schema.py放到已注册的Django app目录下(比如web/emt_rails/schema.py),要么通过上述配置手动指定扩展。 - 确认目标类匹配:检查
target_class是否指向正确的PresentablePrimaryKeyRelatedField类,比如该字段来自第三方包drf-presentable的话,要确保导入路径正确:from drf_presentable.serializers import PresentablePrimaryKeyRelatedField class PresentablePrimaryKeyRelatedFieldSchema(OpenApiSerializerFieldExtension): target_class = PresentablePrimaryKeyRelatedField # 其余代码不变 - 清理缓存并重启服务:执行
python manage.py clearcache清理Django缓存,然后重启开发服务器,避免旧缓存导致新扩展不生效。 - 检查扩展依赖导入:确保
schema.py里导入了所有必需的模块:from drf_spectacular.extensions import OpenApiSerializerFieldExtension from drf_spectacular.utils import build_basic_type, OpenApiTypes, append_meta from drf_spectacular.openapi import AutoSchema, Direction # 导入你的PresentablePrimaryKeyRelatedField
内容的提问来源于stack exchange,提问作者Pooja Kumari
相关产品推荐
相关产品推荐

