我有许多名为“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/