REST API过滤器/使用长颈瓶(和webargs,棉花糖,sqlalchemy)排序

时间:2019-06-17 22:29:34

标签: python rest flask marshmallow webargs

我正在开发我的第一个烧瓶类/ sqlalchemy /棉花糖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导致棉花糖SQLAlchemy返回422无法处理的实体,这是可以理解的,因为new,requestedstatus枚举中不是一个选择。我不确定这是功能还是错误。

顺便说一句,我可以成功地传递两个不同的过滤器参数,例如/deliveries/?status=requested&user_id=123正常工作。

无论如何,排序和分页也是一样。目前,我不知道如何在我的API中处理它们。我看到的当前问题:

  • 我需要添加不映射到DeliverySchema的参数。这似乎表明会对架构代码产生影响。
  • 我不能盲目地将所有参数扔给filter_by,因为某些参数不会成为过滤器。但是对于第一个用例,我很高兴能够根据新状态和请求状态进行过滤。排序和分页可以稍后进行。
  • 语法逻辑需要在某个地方实现。

我什至不知道应该在堆栈中的哪个地方处理它,更不用说如何实现解决方案了。当然,这是一个非常普遍的用例,任何指针都值得赞赏。

0 个答案:

没有答案