前言
定制小程序开发费用在后台管理数据的时候,定制小程序开发费用经常会有多个条件查询,查询参数可以是一个也可以是多个,如果没有查询参数就返回全部数据。
filter()和filter_by() 的使用
使用query查询的时,可以使用filter()和filter_by() 过滤条件。
filter_by() 参数直接用属性名,比较用一个=
filter() 参数 用类名.属性名,比较用 ==
主要区别
模块 | 参数 | 大于(>)和小于(<) | and_、or_、like、in_ |
---|---|---|---|
filter_by() | 直接用属性名,比较用= | 不支持 | 不支持 |
filter() | 用类名.属性名,比较用== | 支持 | 支持 |
filter_by() 只能筛选条件等于,不支持 大于 (>)和小于 (<)和 and_、or_查询
Students.query.filter_by(name='yoyo').all()
- 1
如果需要满足多个条件,查询name名称等于’yoyo’, 并且年龄age等于20,中间用逗号隔开
Students.query.filter_by(name='yoyo', age=20).all()
- 1
等价于filter查询
Students.query.filter(Students.name == 'yoyo').all()Students.query.filter(Students.name == 'yoyo', Students.age == 20).all()
- 1
- 2
filter() 除了可以支持判断等于,还可以支持 大于 (>)和小于 (<)和 and_、or_、like、in_查询
# 大于 >Students.query.filter(Students.age > 20).all()# 小于 <Students.query.filter(Students.age < 20).all()# and_ 查询Students.query.filter(and_(Students.name == 'yoyo', Students.age == 20)).all()# or_查询Students.query.filter(or_(Students.id >= 1, Students.name == 'yoyo')).all()# like 模糊匹配Students.query.filter(Students.name.like('%yoyo%')).all()# _in包含Students.query.filter(Students.name.in_(['yoyo', 'yoyo1'])).all()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
多个条件查询
多个条件查询,并且条件的个数不确定,用filter_by() 只能判断相等和不相等,无法模糊匹配.
如果用filter_by()可以把查询的条件写的一个字典,为None的数据先从字典剔除,如下示例
query_dict = { "name": "zhangsan", "age": 22}# 剔除query_dict参数为空的数据后Students.query.filter_by(**query_dict)
- 1
- 2
- 3
- 4
- 5
- 6
使用filter() 查询功能更灵活,所以大部分会使用filter() 结合 _or
students_filter = Students.query.filter( or_(Students.name == name, name == None), or_(Students.tel == tel, tel == None), or_(Students.email == email, email == None), ).all()
- 1
- 2
- 3
- 4
- 5
get请求query传参/api/student?name=yoyo&tel=12222
参考教程