REST API фильтр / сортировка с помощью колбы (и веб-арг, зефир, sqlalchemy)

Я работаю над своим первым REST API-классом для фляги / sqlalchemy / marshmallow. у меня есть Delivery таблица в моей базе данных с status перечисление:

  • новый
  • запрошенный
  • отправляется
  • прибывший
  • закрыто

Как и ожидалось, GET /deliveries/ возвращает список поставок. Вот текущий фрагмент кода из представления:

deliveries_schema = DeliverySchema(many=True)  # a marshmallow-sqlalchemy ModelSchema

class Deliveries(FlaskView):
    @use_kwargs(deliveries_schema.fields)
    def index(self, **kwargs):
        deliveries = Delivery.query.filter_by(**kwargs)
        return deliveries_schema.jsonify(incidents)

Да, я передаю параметры webargs прямо filter_by, Однако, скажем, для данного экрана в клиенте, мне нужно видеть только доставки со статусом новый или запрошенный. Очевидно, имеет смысл реализовать какую-то грамматику фильтра, так как я собираюсь выполнить аналогичные операции для всех видов

К сожалению, следующие GET не работают:

  • /deliveries/?status=new&status=requested возвращает только поставки с status=new - на самом деле он всегда выбирает первый из двух.
  • Как довольно случайный эксперимент /deliveries/?status=new,requested приводит к зефиру-sqlalchemy, возвращающему 422 Непроцессируемого Сущности, который понятен как new,requested не вариант в status ENUM. Я не уверен, если это особенность или ошибка.

Кроме того, я могу успешно передать два разных параметра фильтра, например /deliveries/?status=requested&user_id=123 работает как положено.

Во всяком случае, то же самое касается сортировки и нумерации страниц. В настоящее время я не знаю, как обрабатывать их в моем API. Актуальные проблемы как я их вижу:

  • Мне нужно добавить параметры, которые не отображаются на DeliverySchema, Кажется, это указывает на то, что это повлияет на код схемы.
  • Я не могу просто слепо бросить все параметры, чтобы filter_byпотому что некоторые параметры не будут фильтрами. Но для этого первого варианта использования я был бы счастлив иметь возможность фильтровать на основе новых и запрошенных статусов. Сортировка и разбиение на страницы могут прийти позже.
  • Грамматическая логика должна быть где-то реализована.

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

0 ответов

Другие вопросы по тегам