3

我使用DjangoDRFdrf-yasgSwagger Codegen来自动构建 TypeScript 代码来访问我的 REST API。

在 Django 后端中,我添加了一条与 DRF 一起提供的路径:

rest_router = routers.DefaultRouter()
rest_router.register(r'source/(?P<source_id>[0-9]+)/document', DocumentViewSet)

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')

如何告诉 drf-yasg 将source_id参数设置为整​​数类型?

4

1 回答 1

0
  1. drf-yasg 上的标准 OpenAPISchemaGenerator 仅检查路径变量名称是否与视图查询集模型字段匹配,如果存在则使用模型字段的类型。否则默认为字符串。如果 Document 模型有一个名为“source_id”的数字字段,您的原始代码应该可以工作。对外关系也应该起作用,但是在这种情况下,您的参数名称很可能应该是字段的名称(源)而不是 id 引用(source_id)。

  2. @swagger_auto_schema 应该应用于一个或多个视图方法,而不是视图类。AFAIK 将其应用于视图类什么都不做。见https://drf-yasg.readthedocs.io/en/stable/custom_spec.html#the-swagger-auto-schema-decorator

  3. 作为一个支线任务,我看了看是否可以使用 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

在上面的生成器中,我们允许 drf-yasg 进行初始类型确定,但随后添加了一个额外的步骤,允许在视图类中覆盖类型。

示例视图

class DocumentView(APIView):
    path_type_source_id = openapi.TYPE_INTEGER

使用 SWAGGER_SETTINGS 启用生成器

SWAGGER_SETTINGS = {
    'DEFAULT_GENERATOR_CLASS': 'path.to.CustomSchemaGenerator',
}
于 2020-08-13T19:31:44.860 回答