电子说
背景需求
在电商系统中,订单管理模块常需支持多维度组合查询。典型筛选条件包括:
时间范围:$t in [t_{text{start}}, t_{text{end}}]$
订单状态:$s in {text{待支付}, text{已发货}, text{已完成}}$
金额区间:$p in [p_{min}, p_{max}]$
商品类别:$c = c_{text{target}}$
用户ID:$u = u_{text{specified}}$
接口设计原则
RESTful风格
GET /orders?param1=value1¶m2=value2
参数动态组合
支持任意条件自由组合,未传参数视为不筛选
分页机制
需包含page和size参数,避免全量查询
核心实现方案
from flask import request
from sqlalchemy import and_
@app.route('/orders', methods=['GET'])
def filter_orders():
# 解析查询参数
filters = []
if 'start_time' in request.args:
filters.append(Order.create_time >= request.args['start_time'])
if 'end_time' in request.args:
filters.append(Order.create_time <= request.args['end_time'])
if 'status' in request.args:
filters.append(Order.status == request.args['status'])
# 其他条件类似处理...
# 组合查询与分页
query = Order.query.filter(and_(*filters)) if filters else Order.query
page = query.paginate(page=int(request.args.get('page',1)),
per_page=int(request.args.get('size',20)))
return jsonify([order.to_dict() for order in page.items])

关键优化点
数据库索引
为高频筛选字段(如create_time, status)建立复合索引
满足最左前缀原则:$ text{INDEX}(t,s) $
参数校验
时间格式校验:$text{ISO}8601$
枚举值校验:$s in S_{text{valid}}$
缓存策略
graph LR
A[请求] -- > B{参数是否变化}
B -- >|否| C[返回缓存结果]
B -- >|是| D[数据库查询]
D -- > E[更新缓存]

边界处理
空结果集返回204 No Content
非法参数返回400 Bad Request并携带错误明细
大结果集强制分页,默认限制$text{MAX_SIZE}=100$
总结
多条件筛选接口需平衡灵活性与性能,核心在于:
动态构建查询条件
合理利用数据库索引
规范化参数处理 通过分层设计可满足复杂业务场景,同时保障系统稳定性。欢迎大家留言探讨。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !