Пользовательский параметр пути, анализирующий drf-yasg и Django - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь заставить dry-yasg правильно анализировать параметры из пути. Скажем, у нас есть

path('users/<int:user_id>/', whatever.as_view(...))

В документах swagger он обрабатывается не как int, а string вместо

enter image description here

Я использовал

swagger_auto_schema(manual_parameters = [
openapi.Parameter(
        name,
        openapi.IN_PATH,
        description=desc,
        type=openapi.TYPE_INTEGER,
        required=True
    )
]

, но это довольно раздражает. Я не смог найти функцию / метод / класс, отвечающий за это. Есть ли простой способ изменить поведение этого синтаксического анализатора на основе пути, так что если возникает int, то openapi.TYPE_INTEGER будет возвращено вместо string?

1 Ответ

1 голос
/ 07 мая 2020

определяет тип параметра автоматически в некоторых ситуациях и возвращается к строке, если обнаружение не удается.

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}

Как видите, он пытается получить тип на основе типа столбца набора запросов представления. Если имя вашего параметра не соответствует чему-либо в наборе запросов, вы получите строку. Итак, ваш первый выбор - попробовать использовать имя, которое оно может определить автоматически.

Однако, если это не сработает, вам нужно будет создать подкласс EndpointEnumerator и переопределить get_path_parameters(), вероятно, проще всего вызвать super().get_path_parameters() и go для каждого параметра и замены типа в зависимости от имени переменной.

Для использования этого класса вам понадобится свой собственный OpenAPISchemaGenerator.

  • использовать собственный OpenAPISchemaGenerator
  • переопределить его endpoint_enumerator_class своим собственным EndpointEnumerator
...