自定义路径参数解析drf-yasg和Django
Custom path parameter parsing drf-yasg and Django
我正在尝试强制 dry-yasg
正确解析路径中的参数。假设我们有
path('users/<int:user_id>/', whatever.as_view(...))
在 swagger 文档中,它不被视为 int
,而是 string
而
我用过
swagger_auto_schema(manual_parameters = [
openapi.Parameter(
name,
openapi.IN_PATH,
description=desc,
type=openapi.TYPE_INTEGER,
required=True
)
]
但这很烦人。我找不到负责解析它的 function/method/class。是否有一种简单的方法可以根据路径更改此解析器的行为,以便如果出现 int
则将返回 openapi.TYPE_INTEGER
而不是 string
?
drf-yasg determines the parameter type automatically in some situations,如果检测失败则回退到字符串。
queryset = get_queryset_from_view(view_cls)
for variable in sorted(uritemplate.variables(path)):
model, model_field = get_queryset_field(queryset, variable)
attrs = get_basic_type_info(model_field) or {'type': openapi.TYPE_STRING}
如您所见,它尝试根据视图查询集的列类型获取类型。如果您的参数名称与查询集中的任何内容都不匹配,则会得到一个字符串。所以你的第一选择应该是尝试使用它可以自动检测的名称。
如果这不起作用,您将需要子 class EndpointEnumerator
并覆盖 get_path_parameters()
,可能最容易调用 super().get_path_parameters()
并遍历每个参数并根据变量名替换类型。
要使用此 class,您需要 your own OpenAPISchemaGenerator
。
- use a custom OpenAPISchemaGenerator
- override its endpoint_enumerator_class with your own EndpointEnumerator
我正在尝试强制 dry-yasg
正确解析路径中的参数。假设我们有
path('users/<int:user_id>/', whatever.as_view(...))
在 swagger 文档中,它不被视为 int
,而是 string
而
我用过
swagger_auto_schema(manual_parameters = [
openapi.Parameter(
name,
openapi.IN_PATH,
description=desc,
type=openapi.TYPE_INTEGER,
required=True
)
]
但这很烦人。我找不到负责解析它的 function/method/class。是否有一种简单的方法可以根据路径更改此解析器的行为,以便如果出现 int
则将返回 openapi.TYPE_INTEGER
而不是 string
?
drf-yasg determines the parameter type automatically in some situations,如果检测失败则回退到字符串。
queryset = get_queryset_from_view(view_cls)
for variable in sorted(uritemplate.variables(path)):
model, model_field = get_queryset_field(queryset, variable)
attrs = get_basic_type_info(model_field) or {'type': openapi.TYPE_STRING}
如您所见,它尝试根据视图查询集的列类型获取类型。如果您的参数名称与查询集中的任何内容都不匹配,则会得到一个字符串。所以你的第一选择应该是尝试使用它可以自动检测的名称。
如果这不起作用,您将需要子 class EndpointEnumerator
并覆盖 get_path_parameters()
,可能最容易调用 super().get_path_parameters()
并遍历每个参数并根据变量名替换类型。
要使用此 class,您需要 your own OpenAPISchemaGenerator
。
- use a custom OpenAPISchemaGenerator
- override its endpoint_enumerator_class with your own EndpointEnumerator