我正在使用PynamoDB,并尝试对来自flask请求的属性进行动态查询/扫描。假设模型如下:
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扫描方法,您有什么想法吗?
发布于 2018-03-17 07:45:54
这样如何:
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))) 发布于 2018-03-02 01:55:59
您是否尝试过:
query = (Test.a == 123) | (Test.b == 456)
list( Test.scan(query))https://stackoverflow.com/questions/48089051
复制相似问题