因Apigee不支持format: uuid,如何用drf-spectacular移除AlbumSerializer的该配置?
移除drf-spectacular生成的OpenAPI Schema中uuid字段的format属性
因为Google Apigee不支持format: uuid类型,你可以用以下两种方式移除AlbumSerializer里uuid字段的这个属性:
方法一:自定义无format的UUID字段
直接替换Serializer里的默认UUIDField,自定义字段的schema只返回string类型:
from rest_framework.fields import UUIDField from drf_spectacular.utils import extend_schema_field class NoFormatUUIDField(UUIDField): @extend_schema_field({'type': 'string'}) def to_representation(self, value): return super().to_representation(value)
之后在你的AlbumSerializer里,把原来的UUIDField()换成NoFormatUUIDField()即可。
方法二:全局修改schema(通过postprocessing hook)
如果想一次性处理所有uuid字段,不用逐个改Serializer,可以配置drf-spectacular的后置钩子:
- 在项目的
settings.py里添加配置:
SPECTACULAR_SETTINGS = { # 其他配置... 'POSTPROCESSING_HOOKS': ['your_project_name.utils.remove_uuid_format'], }
- 在项目的
utils.py里实现钩子函数:
def remove_uuid_format(schema, request, public): def traverse_schema(obj): if isinstance(obj, dict): # 找到类型为string且format为uuid的字段,删除format属性 if obj.get('type') == 'string' and obj.get('format') == 'uuid': obj.pop('format', None) # 递归处理嵌套结构 for value in obj.values(): traverse_schema(value) elif isinstance(obj, list): for item in obj: traverse_schema(item) traverse_schema(schema) return schema
两种方法选哪个看需求:方法一精准控制单个字段,方法二全局批量处理。
内容的提问来源于stack exchange,提问作者Ajax
相关产品推荐
相关产品推荐

