Python sqlalchemy-处理几个可选过滤器的优雅方式?
假设我有一个查询方法,它带有几个可选的过滤器。我想要实现的是,如果我将一些not None值传递给过滤器参数,然后执行过滤器,如果过滤器值为None,则忽略它Python sqlalchemy-处理几个可选过滤器的优雅方式?,python,mysql,coding-style,sqlalchemy,Python,Mysql,Coding Style,Sqlalchemy,假设我有一个查询方法,它带有几个可选的过滤器。我想要实现的是,如果我将一些not None值传递给过滤器参数,然后执行过滤器,如果过滤器值为None,则忽略它 def get_query_results(filter1=None, filter2=None, ...): res = models.Item.query if filter1 is not None: res = res.filter(filter1=filter1) if filter2 i
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时省略筛选?与您显示的代码完全相同的代码是:
def get_query_results(*filters):
res = models.Item.query
for i, filt in enumerate(filters, 1):
if filt is not None:
d = {'filter{}'.format(i): filt}
res = res.filter(**d)
return res.all()
我不太清楚为什么需要将res.filter
的命名参数指定为filter1
、filter2
,等等,但是这个代码段可以做到这一点,而不需要重复您想要避免的模式
如果名称不是实际上是filter1
,filter2
等,只要已知所需的名称就可以了:
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()
在这种情况下,此变体将起作用