我正在使用django-rest-swagger==2.1.2
和djangorestframework==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
这将导致我在此视图中使用大方的用户界面,如下所示:
但是当我进入这样的不同状态时...
...然后单击“尝试”,我得到一个如下所示的请求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
答案 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.Document
和coreapi.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
就容易了。