繁体   English   中英

从dict构建SQLAlchemy查询过滤器时使用'like','<='和'='运算符

[英]Using 'like', '<=' and '=' operators when building an SQLAlchemy query filter from dict

我目前有一个python字典,该字典是根据用户通过表单提交的数据创建的。 表单字段是可选的,但是如果全部填写,则字典( dict_filter )可能看起来像这样:

{“ item_type”:“键盘”,“ location”:“ storage1”}

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

items = Item.query.filter_by(**dict_filter).all()

这样可以正常工作,并根据需要返回当前在storage1所有keyboard项目。

但是,我想向表单中添加两个新的日期字段,以便完全填写的表单将导致类似于以下内容的字典:

{“ item_type”:“键盘”,“位置”:“ storage1”,“ purchase_date”:2017-02-18,“ next_maintenance”:2018-02-18}

基于此新指令,我想执行以下操作:

首先,在过滤item_type时使用like() 我希望这样做,以便如果用户搜索keyboard那么结果还将包括诸如mechanical keyboard类的项目。 我知道我可以单独执行此操作,如下所示:

val = form.item_type.data
items = Item.query.filter(getattr(Item, 'item_type').like("%%%s%%" % val)).all()

其次,在处理日期时,请使用“ <=”(小于或等于)运算符,例如,如果用户以表格形式输入purchase_date ,则所有返回的商品都将在同一日期之前或同一日期具有purchase_date用户输入的日期。 我知道我可以单独执行此操作,如下所示:

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))

第三,如果在表格中填写了location字段,则查询应检查具有匹配位置的项目(如当前对dict所做的那样)。 我知道我可以像现在一样使用dict来做到这一点:

dict = {"location": "storage1"}
items = Item.query.filter_by(**dict_filter).all()

要么

items = Item.query.filter_by(location=form.location.data).all()

我面临的最大挑战是,由于表单字段是可选的,因此我无法事先知道必须应用哪种过滤条件组合。 因此,对于一个用户的输入,我可能必须在数据库中搜索office1所有screen项目,并在yyyy-mm-dd之前添加next_maintenance日期,而对于另一用户的输入,我必须在数据库中搜索所有内容所有位置上的项目,无论next_maintenance日期如何, yyyy-mm-dd之前的purchase_date ,依此类推。 这就是为什么我当前使用字典作为过滤器的原因。 它允许我检查表单字段是否已完成,如果完成了,则将其添加到字典中,并仅基于具有输入内容的表单字段进行过滤。

综上所述,如何将上面讨论的所有三个过滤器(如<=,=)组合为一个,同时又考虑到并非总是需要所有三个过滤器这一事实?

这不是要回答,而是要发表评论。 但是显然我不能在注释中使用代码块。

如果您不知道,可以将多个filterfilter_by通过将它们链接在一起来使用,如下所示:

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

因此,您可以将返回值临时存储为变量(实际上是Query的对象),并在以后使用。

q = Item.query.filter(Item.a < 5)

if some_condition_value:
    q = q.filter(Item.b > 6)

items = q.all()

您可以将条件应用于Query对象,然后可以具有可选的过滤器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM