Как указать необязательные параметры для метода ViewSet @action? - PullRequest
1 голос
/ 17 апреля 2019

У меня есть ViewSet класс с методом, подобным этому:

@action(methods=["get"], detail=True, url_path="foo")
def foo(self, request: Request, pk: int) -> Response:
    limit = request.query_params.get("limit")
    if limit is not None:
        limit = int(limit)
    …

Я бы хотел

  1. объявите метод, чтобы сгенерированная спецификация OpenAPI документировала этот необязательный параметр,
  2. в идеале, чтобы мне не приходилось вручную возиться с извлечением переменной и ее преобразованием.

Нечто подобное было бы идеально:

def foo(self, _: Request, pk: int, limit: Optional[int] = None) -> Response:

Но это не работает - limit просто всегда None.


Решение для пункта 1 выше - еще немного украсить метод:

@swagger_auto_schema(
    manual_parameters=[
        openapi.Parameter(
            "limit",
            openapi.IN_QUERY,
            required=False,
            type=openapi.TYPE_INTEGER
        )
    ]
)

1 Ответ

1 голос
/ 17 апреля 2019

Чтобы иметь возможность делать то, что вам нужно, вам нужно захватить параметры строки запроса в отображении URL Django, но Django только ищет путь запроса и не учитывает параметры строки запроса: docs (вплоть до того, как django сопоставляет URL-адреса с представлениями до того, как в игру вступят наборы DRF и представления)

Единственный способ, который я могу придумать для достижения того, чего вы хотите, - это предоставить ограничение в качестве параметра пути, а не параметра строки запроса. Затем вы можете зафиксировать лимит из пути запроса и включить его в метод представления в качестве параметра, например так:

@action(methods=["get"], detail=True, url_path="foo(?:/(?P<limit>[0-9]+))?")
def foo(self, request: Request, pk: int, limit: Optional[int] = None) -> Response:
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...