我目前有一个python字典,它是根据用户通过表单提交的数据创建的。表单字段是可选的,但如果它们都填写完整,那么字典(dict_filter
)可能如下所示:
{“item_type”:“键盘”,“位置”:“storage1”}
然后我可以查询数据库,如下所示:
items = Item.query.filter_by(**dict_filter).all()
此工作正常,并根据需要返回当前位于keyboard
的所有storage1
项。
但是,我想在表单中添加两个新的日期字段,以便完全填写的表单会产生类似于以下内容的字典:
{“item_type”:“keyboard”,“location”:“storage1”,“purchase_date”:2017-02-18,“next_maintenance”:2018-02-18}
根据这个新词典,我想做以下几点:
首先,在过滤like()
时使用item_type
。我希望如此,如果用户搜索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()
我遇到的最大挑战是,由于表单字段是可选的,我无法事先知道我必须应用哪种过滤条件组合。因此,对于一个用户的输入,我可能需要在screen
之前office1
next_maintenance
之前搜索yyyy-mm-dd
项中的所有next_maintenance
项目。用户的输入我必须在数据库中搜索所有位置的所有项目,无论purchase_date
日期与yyyy-mm-dd
之前的$("body").on("keyup","input.lock", function() {
if( $(this).val() == "abc") {
$(this).css('background-color', 'rgba(0, 255,0,0.4)');
} else {
$(this).css('background-color', 'white');
}
});
如何,依此类推。这正是我目前使用dict作为过滤器的原因;它允许我检查表单字段是否已完成,如果是,则将其添加到dict并仅根据带输入的表单字段进行过滤。
尽管如此,我怎样才能将上面讨论的所有三个过滤器(例如,&lt; =,=)合并为一个,同时还要考虑到并非所有三个过滤器都是必要的?
答案 0 :(得分:1)
这不是一个答案,而是一个评论。但显然我不能在评论中使用代码块。
如果您不知道,可以使用多个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
对象,然后您可以选择过滤器。