2015-01-07 34 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() 

這個變種會在這種情況下工作。