将JSON对象转换为可用的sqlalchemy过滤器语句

时间:2015-03-26 17:26:59

标签: python json flask sqlalchemy

我从烧瓶组件请求我打电话:

request_json = request.get_json() 

这是一个包含以下内容的JSON对象:

{'filter1' : '123', 'filter2' : '456', 'filter3' : '789' }

此外,这些过滤器的大小也可能因前端用户而异。它可能只是一个过滤器或多个过滤器。

我想知道如何将这样的对象转换为可用的查询?我相信我需要使用or_()and_()来构建过滤器。是否有可能做某些事情,比如......

query.filter_by(and_(*request_json))

我对整个技术堆栈都很陌生......任何帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

filter_by使用关键字参数来执行基本相等过滤器。移除and_并将字典直接打印到filter_by

query.filter_by(**request_json)

但是,这不会对键或值进行验证。因此,如果有人通过了'fish': 3并且没有" fish"列,或传入'column4': 'abc'和column4实际上是一个数组类型,你会得到一个错误。

因此,验证并手动进行过滤可能更安全,更直接。

query = MyModel.query

if 'column1' in data:
    try:
        value = int(data['column1'])
    except (TypeError, ValueError):
        pass
    else:
        query = query.filter(MyModel.column1 == value)

if 'column2' in data:
    try:
        value = datetime.utcfromtimestamp(int(data['column2']))
    except (TypeError, ValueError):
        pass
    else:
        query = query.filter(MyModel.column2 >= value)

# etc.

return query