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