这可能是一个与python lang相关的问题,而不是boto3 lib:
该查询有效:
matches = table.query(
IndexName="status-date-index",
KeyConditionExpression=Key('status').eq('next'),
FilterExpression=Attr('teams').contains('a') | Attr('teams').contains('b') | Attr('teams').contains('c')
)
但我会有一个可变列表["a", "b", "c", ...N]
,需要将它们转换为
filter_expression = Attr('teams').contains('a') | Attr('teams').contains('b') | Attr('teams').contains('c') | ...N
任何想法如何在python中做到这一点?或者我可能需要为这种情况做一个更好的FilterExpression?
答案 0 :(得分:1)
您可以使用functools.reduce
在contains
(我假设属于ConditionBase
类型)生成的项目列表中使用or_
operator。functools.map
。你也可以在字符串上加上link,因为你有一堆类似的输入。考虑这个简化的例子:
>>> from functools import map
>>> from functools import reduce
>>> from operator import or_
>>> values = ['9', '3', '7', '32']
>>> map(int, values)
[9, 3, 7, 32]
>>> reduce(or_, map(int, values))
47
完全等同于
>>> 9 | 3 | 7 | 32
47
为了进一步简化从Condition
生成Attr(field).contains(value)
个对象,可以通过列表理解构建一个2元组列表,如此(基于您的原始问题):
raw_conditions = [
('teams', 'a'),
('b', 'cali'),
('teams', 'c'),
]
conditions = [Attr(field).contains(value) for field, value in raw_conditions]
filter_expression = reduce(or_, conditions)
答案 1 :(得分:0)
import operator
filter_exp = reduce(operator.or_, (Attr('teams').contains(x) for x in 'abc'))