python:flask-sqlalchemy结合filter_by和_in

时间:2016-11-18 10:39:10

标签: python flask flask-sqlalchemy

按照this question中的示例,我有一个基于查询字符串参数过滤数据的flask视图:

@app.route('/regs')
def regs_data():

    #check what data is available
    #REGS is a sqlalchemy model
    cols = REGS.__table__.columns.keys()

    kwargs = {}
    for k, v in request.args.lists():
        if k not in cols:
            abort(400, "helpful err msg")

        #takes only first occurrence
        kwargs[k]=v[0]

    my_query = REGS.query.filter_by(**kwargs).all()

    #....modify the query data for return

    return the_data_as_json

这适用于request.args中每个键只出现1次的情况。如何扩展它以应对每个关键字的多个值?例如/regs?foo=1&foo=2

有没有办法同时应用filter_byin_()

由于

1 个答案:

答案 0 :(得分:0)

我能提出的最佳解决方案是迭代每个参数并将过滤器链接在一起。

不是很整洁但是有效。

def regs_data():

    #get allowed data names
    cols = REGS.__table__.columns.keys()

    #make base query object
    my_query = REGS.query

    for k, v in request.args.lists():
        if k not in cols:
            abort(400, "helpful err msg")

        #chain together filters for each arg 
        my_query  = my_query.filter(getattr(REGS, k).in_(tuple(v)))

     #fire the query
     data = my_query.all()


    #....modify the query data for return

    return the_data_as_json