Python 从dict构建SQLAlchemy查询筛选器时使用'like'、'

Python 从dict构建SQLAlchemy查询筛选器时使用'like'、',python,sqlalchemy,Python,Sqlalchemy,我目前有一个python字典,它是根据用户通过表单提交的数据创建的。表单字段是可选的,但如果它们都已填写,则dictionary dict_筛选器可能如下所示: Item.query.filter(Item.a < 5).filter(Item.b > 6).all() {项目类型:键盘,位置:storage1} 然后,我可以查询数据库,如图所示: items = Item.query.filter_by(**dict_filter).all() val = form.item_

我目前有一个python字典,它是根据用户通过表单提交的数据创建的。表单字段是可选的,但如果它们都已填写,则dictionary dict_筛选器可能如下所示:

Item.query.filter(Item.a < 5).filter(Item.b > 6).all()
{项目类型:键盘,位置:storage1}

然后,我可以查询数据库,如图所示:

items = Item.query.filter_by(**dict_filter).all()
val = form.item_type.data
items = Item.query.filter(getattr(Item, 'item_type').like("%%%s%%" % val)).all()
items = Item.query.filter(Item.purchase_date <= form.purchase_date.data)
items = Item.query.filter(and_(Item.purchase_date <= form.purchase_date.data, Item.next_maintenance <= form.next_maintenance.data))
这可以正常工作,并根据需要返回storage1中当前的所有键盘项

但是,我想在表单中添加两个新的日期字段,这样一个完全填写的表单将生成一个类似于以下内容的字典:

{项目类型:键盘,位置:storage1,购买日期:2017-02-18,下次维护:2018-02-18}

根据这条新的格言,我想做以下几点:

首先,在筛选项目类型时使用like。我希望这样,如果用户搜索键盘,那么结果也将包括诸如机械键盘之类的项目。我知道我可以单独完成,如图所示:

items = Item.query.filter_by(**dict_filter).all()
val = form.item_type.data
items = Item.query.filter(getattr(Item, 'item_type').like("%%%s%%" % val)).all()
items = Item.query.filter(Item.purchase_date <= form.purchase_date.data)
items = Item.query.filter(and_(Item.purchase_date <= form.purchase_date.data, Item.next_maintenance <= form.next_maintenance.data))

第二,使用“这不是一个答案,而是一个评论。但显然我不能在注释中使用代码块

如果您不知道,您可以使用多个筛选器或筛选器_,方法是将它们链接在一起,如下所示:

Item.query.filter(Item.a < 5).filter(Item.b > 6).all()

您可以将条件应用于查询对象,然后可以使用可选的过滤器。

这非常有效。我不知道你们可以把过滤器连在一起。这允许我仍然使用dict作为基本过滤器,然后在必要时添加额外的过滤器。非常感谢你!