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
потому что некоторые параметры не будут фильтрами. Но для этого первого варианта использования я был бы счастлив иметь возможность фильтровать на основе новых и запрошенных статусов. Сортировка и разбиение на страницы могут прийти позже. - Грамматическая логика должна быть где-то реализована.
Я даже не знаю, где в стеке это должно быть обработано, не говоря уже о том, как реализовать решение. Конечно, это довольно распространенный случай, оценят любые указатели.