Как настроить пользовательский интерфейс Swagger, чтобы позволить пользователю вводить несколько значений для параметра строки запроса - PullRequest
0 голосов
/ 20 сентября 2018

Я использую 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

Это приводит к тому, что мой пользовательский интерфейс для этого представления выглядит следующим образом:

enter image description here

Но когда я вхожу в другой статус, например ...

enter image description here

... и нажмите «попробовать». Я получаю URL запроса, который выглядит следующим образом:

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

Обратите внимание, что status=pendingповторяется три раза.Я хотел получить URL запроса, который выглядит примерно так:

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

1 Ответ

0 голосов
/ 02 октября 2018

У меня есть некоторые идеи, которые могут вам помочь.

Swagger Spec упоминает allowMultiple параметр в пункте 5.2.4 Parameter Object

allowMultiple Другой способразрешить несколько значений для параметра «запрос».Если используется, параметр запроса может принимать значения через запятую.Поле может использоваться только в том случае, если paramType имеет значение «query», «header» или «path».

Это может быть тем, что вы хотите

Я попытался передать его в 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, как я показал выше.

...