我正在使用PynamoDB并试图对来自烧瓶请求的属性进行动态查询/扫描。假设以下模型:
class Test(Model):
class Meta:
table_name = "test"
region = "us-west-2"
a = NumberAttribute(hash_key=True)
b = NumberAttribute(range_key=True)
c = UnicodeAttribute()
我将这个用螺栓固定在Flask上,这样当用户发送带有?a=123&b=456
等查询参数的请求时,我可以将其转换为PynamoDB中的过滤器,以返回与这两个过滤器匹配记录的结果。
以下适用于单个属性:
>>> query = operator.eq(Test.a, 123)
>>> list(Test.scan(query))
[Test<4426599961>]
我希望能够将其固定在动态数量的属性上(例如,除了a,b和c之外)
我尝试将其转换为元组,但这似乎打破了以下错误:
>>> query = (operator.eq(Test.a, 123), operator.eq(Test.b, 456))
>>> list(Test.scan(*query))
但是我收到以下错误:
Invalid type for parameter Segment, value: b = {'N': '1'}, type: <class 'pynamodb.expressions.condition.Comparison'>, valid types: <type 'int'>, <type 'long'>
关于如何构建动态过滤器以传递到PynamoDB扫描方法的任何想法?
答案 0 :(得分:0)
你试过了吗?
query = (Test.a == 123) | (Test.b == 456)
list( Test.scan(query))
答案 1 :(得分:0)
怎么样:
q = { 'a': 123, 'b': 456 }
query = None
for fieldname in q:
field = getattr(Test, fieldname, None)
if field is None: continue
clause = field == q[fieldname]
query = clause if query is None else query & clause
print(list(Test.scan(cond)))