从dict

时间:2017-04-14 01:32:29

标签: python sqlalchemy

我目前有一个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; =,=)合并为一个,同时还要考虑到并非所有三个过滤器都是必要的?

1 个答案:

答案 0 :(得分:1)

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

如果您不知道,可以使用多个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对象,然后您可以选择过滤器。