sqlalchemy - 处理几个可选过滤器的优雅方式?
sqlalchemy - elegant way to deal with several optional filters?
假设我有一个带有多个 可选 过滤器的查询方法。我想要实现的是,如果我将一些非 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 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()
这种变体适用于这种情况。
假设我有一个带有多个 可选 过滤器的查询方法。我想要实现的是,如果我将一些非 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 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()
这种变体适用于这种情况。