我正在开发我的第一个 flask-classful / sqlalchemy / marshmallow REST API。我的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
导致 marshmallow-sqlalchemy 返回 422 Unprocessable Entity,这是可以理解的,因为new,requested
它不是status
枚举中的选项。我不确定这是功能还是错误。
顺便说一句,我可以成功传递两个不同的过滤器参数,例如/deliveries/?status=requested&user_id=123
按预期工作。
无论如何,排序和分页也是如此。目前我不知道如何在我的 API 中处理它们。我看到的当前问题:
- 我需要添加不映射到
DeliverySchema
. 这似乎表明会对模式代码产生影响。 - 我不能盲目地将所有参数都扔到
filter_by
,因为有些参数不会是过滤器。但是对于第一个用例,我很高兴能够根据新的和请求的状态进行过滤。排序和分页可以稍后进行。 - 语法逻辑需要在某个地方实现。
我什至不知道应该在堆栈中的哪个位置处理,更不用说如何实现解决方案了。当然,这是一个非常常见的用例,任何指针表示赞赏。