Chet Meinzer
Chet Meinzer

Reputation: 1741

pass in table name to sqlalchemy query through url in flask

In short, how do i

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

explanation
My goal is to allow the user to change the order of list of items.
I set up an ajax call that sends an array of id's to the api below.
It works if i hard code the query, and make a api view per table.
my problem is that i want "table" to fill in this line

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

to complete the query.

here is the view api which gives me an error "no attribute '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)

Upvotes: 1

Views: 1193

Answers (1)

msvalkon
msvalkon

Reputation: 12077

You can use getattr():

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

getattr() will raise an AttributeError if the attribute your trying to get does not exist.

Example for your order()-function:

@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)

Upvotes: 3

Related Questions