如何配置swagger UI以允许用户输入查询字符串参数的多个值

时间:2018-09-19 21:32:13

标签: python django django-rest-framework swagger swagger-ui

我正在使用django-rest-swagger==2.1.2djangorestframework==3.7.7,并且具有如下所示的视图:

class PendingRequests(generics.GenericAPIView):
    ...
    filter_backends = (PendingRequestsFilter,)

    def get(self, request):
        ...
        request_status = request.GET.getlist('status')
        request_start_date = request.GET.get('start_date')
        request_end_date = request.GET.get('end_date')
        ...

并且我已经定义了一个过滤器,如下所示:

class PendingRequestsFilter(BaseFilterBackend):
    def get_schema_fields(self, view):
        fields = [
            coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='active'),
            coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='pending'),
            coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='inactive'),
            coreapi.Field(name="start_date", description="Start Date of the Request (YYYY-MM-DD)", required=False, location='query', example='2525-12-25'),
            coreapi.Field(name="end_date", description="End Date of the Request (YYYY-MM-DD)", required=False, location='query', example='2525-12-26'),
        ]
        return fields

这将导致我在此视图中使用大方的用户界面,如下所示:

enter image description here

但是当我进入这样的不同状态时...

enter image description here

...然后单击“尝试”,我得到一个如下所示的请求URL:

http://myserver:4800/api/v1/sudorequests/requests/?status=pending&status=pending&status=pending

请注意,status=pending重复了3次。我想要一个看起来更像这样的请求URL:

http://myserver:4800/api/v1/sudorequests/requests/?status=inactive&status=active&status=pending

1 个答案:

答案 0 :(得分:1)

我有一些见解可以为您提供帮助。

Swagger Spec在第allowMultiple段中提到了5.2.4 Parameter Object的设置

  

allowMultiple允许为一个   “查询”参数。如果使用,查询参数可以接受   逗号分隔值。仅当paramType为   “查询”,“标题”或“路径”。

那可能就是你想要的

我尝试这样将其传递给coreapi.Field

coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='active', allowMultiple=True)

但这不起作用

接下来,我搜索了swagger-ui.js,发现了这一行

var isArray = paramType.toLowerCase() === 'array' || param.allowMultiple;

幸运的是,coreapi.Field只是一个namedtuple,它传递了所有必要的参数以大张旗鼓。看起来像这样:

Field = namedtuple('Field', ['name', 'required', 'location', 'schema', 'description', 'type', 'example'])
Field.__new__.__defaults__ = (False, '', None, None, None, None)

我的想法是扩展并使用它而不是coreapi.Field。我正在修补,因为某些coreapi.Documentcoreapi.Link逻辑迫使我们这样做。

coreapi.Field = namedtuple('Field', coreapi.Field._fields + ('allowMultiple',))
coreapi.Field.__new__.__defaults__ = (False, '', None, None, None, None, False)

然后像这样使用它:

coreapi.Field(name="status", description="Statuses of the Requests", required=False, location='query', example='active', allowMultiple=True)

不幸的是仍然有错误,但是我还是决定将其发布。也许我们可以一起解决。 我仍在努力,觉得自己快到了。

编辑

我已经尝试克服该错误,但是逐渐变得很明显,如果您确实需要该功能,那么像我上面显示的那样,只需派生coreapi库并编辑Field就容易了。