[英]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
,依此类推。 这就是为什么我当前使用字典作为过滤器的原因。 它允许我检查表单字段是否已完成,如果完成了,则将其添加到字典中,并仅基于具有输入内容的表单字段进行过滤。
综上所述,如何将上面讨论的所有三个过滤器(如<=,=)组合为一个,同时又考虑到并非总是需要所有三个过滤器这一事实?
这不是要回答,而是要发表评论。 但是显然我不能在注释中使用代码块。
如果您不知道,可以将多个filter
或filter_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.