django - 有没有办法更改 drf-spectaulous 中序列化器自动生成的架构名称

标签 django django-rest-framework openapi drf-spectacular

我有许多名为“InputSerializer”和“OutputSerializer”的序列化器,它们在 drf-spectaulous 中转换为“输入”和“输出”模式名称。这最终会将 api 端点引用到相同的模式。有没有办法覆盖这些序列化器自动生成的模式名称而不更改类的名称?

最佳答案

我遇到过很多次,但从未尝试解决它。查看我发现的文档 extended_schema_serializer ,这可能会满足您的需要。这是full api ,以及相关点:

  • component_name – 覆盖默认类名提取
@extended_schema_serializer(component_name="SomeNiceReallyLongId")
class Input(Serializer):
    # pass

它有点长而且丑陋,但是可以通过装饰器上的装饰器来修复:D

编辑:

我最终实现了这个。这是我写的小包装。它只是使序列化器和字段之间的事情变得更短和一致。

您可以在序列化器上多次使用 extended_schema_serializer,因此这不会破坏任何内容。

@oapi.name("UserEditRequest")
@extend_schema_serializer(examples=[]) # other settings
class EditSerializer(ModelSerializer):
    pass
# oapi.py
from drf_spectacular.utils import set_override as _set_override

def name(val: str):
    def decorator(klass):
        if issubclass(klass, BaseSerializer):
            _set_override(klass, "component_name", val)
        elif isinstance(klass, Field):
            _set_override(klass, "field_component_name", val)
        else:
            raise Exception(f"Unhandled class: {klass}")

        return klass

    return decorator

关于django - 有没有办法更改 drf-spectaulous 中序列化器自动生成的架构名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72366171/

相关文章:

html - Django:允许从文本区域输入换行

python - 检查Django模板中列表变量项中是否存在某些内容

spring-boot - Spring Boot 应用程序中的错误 - 无法映射重复的端点操作 : [MBean call 'topology' ] to topologyEndpoint

azure - Swashbuckle 生成的 Swagger 在 Azure API 管理中创建重复的版本路径

java - Swagger codegen to Java Spring 从二进制格式的 OpenAPI 组件生成不正确的文件响应实体

django - 在基于 Django 类的 View 中使用 modelformset_factory

django - 上传数据URL到Django服务器

django - HyperlinkedIdentityField 仅在用户模型上返回错误

python - 值错误: too many values to unpack (expected 3) in url config

python - 使用 ChoiceField 时类型错误对象不可 JSON 序列化