通过URL将表名传递给Flask中的SQLAlchemy查询

1 投票
1 回答
1181 浏览
提问于 2025-04-18 09:31

简而言之,我该怎么做

 var="TableName"
 models.var.query.all()

解释
我的目标是让用户可以改变一系列项目的顺序。
我设置了一个ajax调用,它会把一组ID发送到下面的API。
如果我把查询写死,也就是直接写死每个表的API视图,这样是可以工作的。
但我遇到的问题是,我想让“table”在这一行中自动填充

 models.table.query.filter_by(id=item).first() 

以完成查询。

这是API视图,但我遇到了一个错误:“没有属性'table'”

@app.route('/order/<table>')
def order(table):
    # import pdb;pdb.set_trace()
    sortedItems = request.args.listvalues()[0]
    o=1
    import pdb;pdb.set_trace()
    for item in sortedItems:
        grab = models.table.query.filter_by(id=item).first() 
        grab.order=o
        o=o+1
    db.session.commit()
    return jsonify(result=sortedItems)

1 个回答

3

你可以使用 getattr() 这个函数:

>>> var = 'table_name'
>>> table = getattr(models, var)
>>> table.query.filter_by(id=item).first()

如果你试图获取的属性不存在,getattr() 会抛出一个 AttributeError 错误。

下面是你 order() 函数的一个例子:

@app.route('/order/<table>')
def order(table):
    sortedItems = request.args.listvalues()[0]
    o=1
    table = getattr(models, table)
    for item in sortedItems:
        grab = table.query.filter_by(id=item).first() 
        grab.order=o
        o=o+1
    db.session.commit()
    return jsonify(result=sortedItems)

撰写回答