2014-10-10 48 views
1

是否有可能动态地添加过滤器给Peewee选择语句给定一个列表?例如,而不是:如何动态创建where子句给定的参数列表?

Table.select().paginate(page,ENTRY_PER_PAGE).where((Table.Base==Base1) & (Table.Base==Base2) & ...) 

我想传中,说list,它会通过内容在list过滤:

list = [Base1, Base2, Base3...] 
Table.select().paginate(page,ENTRY_PER_PAGE).where((Table.Base==contentfromList)) 

回答

2

您可以使用reduce(在Python 3 functools.reduce。 x)的:

>>> import operator 
>>> reduce(operator.mul, [2, 3, 5]) 
30 
>>> 2 * 3 * 5 
30 

随着发电机表达:

base_list = [Base1, Base2, Base3] 
Table.select().paginate(page,ENTRY_PER_PAGE).where(
    reduce(oeprator.and_, (Table.Base == b for b in base_list)) 
) 

而不是operator.and_operator.__and__),如果你需要表达更复杂的表达式,你也可以使用lambda

... 
reduce(lambda a, b: a & b, (Table.Base == b for b in base_list)) 
... 
+0

啊,太好了!问题是,operator.and_中的“_”究竟是什么?任何我们不能简单地使用&&或||的理由? – 2014-10-10 13:29:05

+0

@ Stupid.Fat.Cat,如果你的意思是'(... for .. in ...)',它是一个[生成器表达式](https://docs.python.org/2/tutorial/classes.html #发电机表达式)。 – falsetru 2014-10-10 13:30:10

+0

@Stupid.Fat.Cat,Python中没有'&&','||'运算符,但是'''',','或'。 – falsetru 2014-10-10 13:30:59