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

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

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

Как и ожидалось, 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 Unprocessable Entity, что понятно как new,requestedне указывается в перечислении status.Я не уверен, является ли это функцией или ошибкой.

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

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

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

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

...