rom*_*mor 5 django django-rest-framework drf-yasg
我使用Django、DRF、drf-yasg和Swagger Codegen自动构建 TypeScript 代码来访问我的 REST API。
在 Django 后端中,我添加了一条与 DRF 一起提供服务的路径:
rest_router = routers.DefaultRouter()
rest_router.register(r'source/(?P<source_id>[0-9]+)/document', DocumentViewSet)
Run Code Online (Sandbox Code Playgroud)
DocumentViewSet是一个 DRF ModelViewSet。
可以看到,source_id参数是数字类型。但是,生成的 API 描述将source_id参数定义为 String 类型。
显然路径设置中的数字正则表达式是不够的,所以我想我需要在类中使用一些类型注释DocumentViewSet?我尝试了以下代码,但这没有效果:
@swagger_auto_schema(
manual_parameters=[
openapi.Parameter(name="source_id",
required=True,
type="integer",
in_="path",
description="Source reference",
),
],
)
class DocumentViewSet(viewsets.ModelViewSet):
serializer_class = rest_serializers.DocumentSerializer
queryset = models.Document.objects.all().order_by('id')
Run Code Online (Sandbox Code Playgroud)
如何告诉 drf-yasg 将source_id参数设置为 Integer 类型?
drf-yasg 上的标准 OpenAPISchemaGenerator 仅检查路径变量名称是否与视图查询集模型字段匹配,并使用模型字段的类型(如果存在)。否则默认为字符串。如果文档模型有一个名为“source_id”的数字字段,您的原始代码应该可以工作。外部关系也应该有效,但在这种情况下,您的参数名称很可能应该是字段的名称(源),而不是 id 引用 (source_id)。
@swagger_auto_schema 应该应用于视图方法,而不是视图类。AFAIK 将其应用于查看类没有任何作用。请参阅https://drf-yasg.readthedocs.io/en/stable/custom_spec.html#the-swagger-auto-schema-decorator
作为一个附带任务,我查了一下是否可以使用 python 内置类型来确定类型,简短的答案是肯定的,但有点混乱。如果有人发现它有用,请将其扔掉,使用它需要您自担风险。
class CustomSchemaGenerator(OpenAPISchemaGenerator):
def get_path_parameters(self, path, view_cls):
parameters = super().get_path_parameters(path, view_cls)
for p in parameters:
if p.in_ == openapi.IN_PATH and p.type == openapi.TYPE_STRING:
p.type = getattr(view_cls, f'path_type_{p.name}', openapi.TYPE_STRING)
return parameters
Run Code Online (Sandbox Code Playgroud)
在上面的生成器中,我们允许 drf-yasg 进行初始类型确定,但随后添加一个额外的步骤,允许覆盖视图类中的类型。
示例视图
class DocumentView(APIView):
path_type_source_id = openapi.TYPE_INTEGER
Run Code Online (Sandbox Code Playgroud)
使用 SWAGGER_SETTINGS 启用生成器
SWAGGER_SETTINGS = {
'DEFAULT_GENERATOR_CLASS': 'path.to.CustomSchemaGenerator',
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4134 次 |
| 最近记录: |