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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:47:11