2015-01-07 33 views
4

假设我有一个查询方法,其中包括可选过滤器。我想实现的是,如果我传递一些非None值来过滤参数,那么做一个过滤器,如果过滤器值为None,那么就忽略它。sqlalchemy - 优雅的方式来处理几个可选的过滤器?

def get_query_results(filter1=None, filter2=None, ...): 
    res = models.Item.query 
    if filter1 is not None: 
     res = res.filter(filter1=filter1) 
    if filter2 is not None: 
     res = res.filter(filter2=filter2) 
    .... 
    return res.all() 

我想避免的是模式

if XXX: 
    res.filter(XXX=XXX) 

我不知道是否有任何更优雅的方式来实现这一目标?

例如,通过各种过滤器作为参数?

或者,也许,我们可以做一些神奇的事情,当过滤器值为None时省略过滤器?

回答

2

代码完全等同于你所示的是:

​​

我不明白为什么你需要的命名参数res.filter是专门filter1filter2等,但这个片段将没有你可以理解的想要避免的重复模式。

如若名实际上是filter1filter2等,只要所需要的名字被称为是确定:

NAMES = 'foo bar baz bat'.split() 

def get_query_results(*filters): 
    res = models.Item.query 
    for name, filt in zip(NAMES, filters): 
     if filt is not None: 
      d = {name: filt} 
      res = res.filter(**d) 
    return res.all() 

这个变种会在这种情况下工作。