【问题标题】:Flask-SqlAlchemy or SqlAlchemy filter byFlask-SqlAlchemy 或 SqlAlchemy 过滤器
【发布时间】:2018-02-07 02:26:10
【问题描述】:

我正在使用用户表单输入查询数据库模型。我的相关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" 的值时,查询工作正常。但是,当我在表单中选择“任何”选项时,查询没有任何结果。

我想要的是,当用户选择“任何”时,查询将返回 db 中的所有汽车。如果选择了“任何”,这实质上就是从查询中删除 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())

问候。

【问题讨论】:

    标签: python html mysql sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您可以通过传递给 filter_by 函数的关键字参数来实现这一点 您只需将那些值添加到关键字参数中,这些值具有除“任何”以外的值

    以下是您可以实现的示例代码 - 当用户选择“任何”时,查询将返回 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())
    

    【讨论】:

    • 感谢 PythonUser。但要使上述方法起作用,我将不得不添加多个 if else 语句,因为我将根据 7 种不同的标准(如颜色、里程等)进行过滤?
    • 是的...您可以通过创建通用函数来实现的另一种方法,该函数将返回具有某些值的键和值的字典
    猜你喜欢
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 2016-05-08
    相关资源
    最近更新 更多