除了为 drf-spectacular 的 extend_schema 请求参数使用序列化程序之外,还有其他选择吗?
Is there an alternative to using a serializer for drf-spectacular's extend_schema request param?
我正在使用 drf-spectacular 生成 swagger/redoc API 文档。
最有用的功能之一是能够通过生成的 swagger html 页面测试请求,但我想强制执行 application/x-www-form-urlencoded 内容类型,以便当我的 Django 端点收到请求时,request.data 具有编码数据,而不是作为查询字符串的一部分结束。 drf-spectacular 似乎总是默认查询字符串,例如/objects/action/?键=值
我想出如何做到这一点的唯一方法是use a serializer in conjunction with the request content-type例如
@extend_schema(
request={'application/x-www-form-urlencoded': DoTheActionInputsSerializer},
responses={200: DoTheActionOutputsSerializer},
methods=["POST"]
)
@action(methods=['post'], detail=False)
def do_the_action(self, request, *args, **kwargs):
...
这很好用,但它确实需要很多可能只有一个或两个属性的小型序列化程序。在 extend_schema 装饰器中是否有实现此目的的替代方法?
我希望像下面这样的东西能起作用,但没有
request={'application/x-www-form-urlencoded': {'schema': {'foo_id': OpenApiTypes.INT}}},
我认为 documentation 回答了这个问题。对于那些一次性的小案例,您可以使用 inline_serializer
。它允许您这样做:
@extend_schema(responses={
'2XX': SimpleSerializer,
'401': inline_serializer('Error1', fields={'detail': serializers.CharField()}),
})
这对 @extend_schema(request=inline_serializer(...))
是一样的
万不得已,您还可以将原始模式字典放入 request
或 response
。
注意:如果你想让application/x-www-form-urlencoded
被自动检测到,只需要
@action(methods=['post'], detail=False, parser_classes=[parsers.FormParser])
我正在使用 drf-spectacular 生成 swagger/redoc API 文档。
最有用的功能之一是能够通过生成的 swagger html 页面测试请求,但我想强制执行 application/x-www-form-urlencoded 内容类型,以便当我的 Django 端点收到请求时,request.data 具有编码数据,而不是作为查询字符串的一部分结束。 drf-spectacular 似乎总是默认查询字符串,例如/objects/action/?键=值
我想出如何做到这一点的唯一方法是use a serializer in conjunction with the request content-type例如
@extend_schema(
request={'application/x-www-form-urlencoded': DoTheActionInputsSerializer},
responses={200: DoTheActionOutputsSerializer},
methods=["POST"]
)
@action(methods=['post'], detail=False)
def do_the_action(self, request, *args, **kwargs):
...
这很好用,但它确实需要很多可能只有一个或两个属性的小型序列化程序。在 extend_schema 装饰器中是否有实现此目的的替代方法?
我希望像下面这样的东西能起作用,但没有
request={'application/x-www-form-urlencoded': {'schema': {'foo_id': OpenApiTypes.INT}}},
我认为 documentation 回答了这个问题。对于那些一次性的小案例,您可以使用 inline_serializer
。它允许您这样做:
@extend_schema(responses={
'2XX': SimpleSerializer,
'401': inline_serializer('Error1', fields={'detail': serializers.CharField()}),
})
这对 @extend_schema(request=inline_serializer(...))
万不得已,您还可以将原始模式字典放入 request
或 response
。
注意:如果你想让application/x-www-form-urlencoded
被自动检测到,只需要
@action(methods=['post'], detail=False, parser_classes=[parsers.FormParser])