Flask-SqlAlchemy或SqlAlchemy按

时间:2018-02-05 05:53:17

标签: python html mysql sqlalchemy flask-sqlalchemy

我正在使用用户表单输入查询数据库模型。我的相关HTML表单输入语法如下:

<label>Make</label>
 <select name="Car_Make" id="Car_Make_Selector" class="form-control">
   <option value="" >Any</option>
   <option value="Toyota">Toyota</option>

sqlAlchemy查询如下:

Searched_Cars = Cars.query.filter_by(Car_Make=request.args.get('Car_Make')).order_by(Cars.Date_Created.desc())

现在,当我在表格中为Car_Make =“Toyota”选择一个值时,查询工作正常。但是当我在表单中选择“Any”选项时,查询结果为空。

我想要的是,当用户选择“任意”时,查询将返回db中的所有汽车。如果选择“Any”,那么本质上是从查询中删除filter_by子句。

此外,鉴于我有7个标准来搜索颜色,模型和年份等,并且用户可以选择这些标准中的任何一个或多个作为“任何”。那么,以下查询语法是否适用于多个搜索条件?

Searched_Cars = Cars.query.filter_by(Car_Make=request.args.get('Car_Make'),Car_Model=request.args.get('Car_Model'),Car_Colour=request.args.get('Car_Colour')).order_by(Cars.Date_Created.desc())

问候。

1 个答案:

答案 0 :(得分:0)

您可以通过传递给filter_by函数的关键字参数来实现此目的 您只需要将这些值添加到关键字参数中,这些参数的值不是“任何”

下面是示例代码,您可以实现它 - 当用户选择“Any”时,查询将返回db中的所有汽车

filter_arguments = {}
if request.args.get('Car_Make'):
    filter_arguments.update(Car_Make=request.args.get('Car_Make'))
Searched_Cars = Cars.query.filter_by(**filter_arguments).order_by(Cars.Date_Created.desc())

所以上面的代码只会添加那些有值的过滤条件

同样可以用于其他过滤条件

但请注意,要处理所有过滤条件,您需要运行查询而不使用filter_by,如下所示

filter_arguments = {}
if request.args.get('Car_Make'):
    filter_arguments.update(Car_Make=request.args.get('Car_Make'))
if filter_arguments:
    Searched_Cars = Cars.query.filter_by(**filter_arguments).order_by(Cars.Date_Created.desc())
else:
   Searched_Cars = Cars.query.order_by(Cars.Date_Created.desc())