背景需求
在电商系统中,订单管理模块常需支持多维度组合查询。典型筛选条件包括:
时间范围:$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}}$
接口设计原则
核心实现方案
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$
总结
多条件筛选接口需平衡灵活性与性能,核心在于:
动态构建查询条件
合理利用数据库索引
规范化参数处理 通过分层设计可满足复杂业务场景,同时保障系统稳定性。欢迎大家留言探讨。