0

我正在开发我的第一个 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,因为有些参数不会是过滤器。但是对于第一个用例,我很高兴能够根据新的和请求的状态进行过滤。排序和分页可以稍后进行。
  • 语法逻辑需要在某个地方实现。

我什至不知道应该在堆栈中的哪个位置处理,更不用说如何实现解决方案了。当然,这是一个非常常见的用例,任何指针表示赞赏。

4

0 回答 0