11

我一直在试图弄清楚如何将 request.args 传递给 sqlalchemy 过滤器。

我认为这应该工作:

model.query.filter(**request.args).all()

但它抛出了错误:

TypeError: <lambda>() got an unexpected keyword argument 'userid'

当 userid 或任何其他 get arg 存在时。

根据这篇文章 - https://stackoverflow.com/questions/19506105/flask-sqlalchemy-query-with-keyword-as-variable - 您可以将 dict 传递给过滤器函数。

任何想法我做错了什么?

非常感谢 :)

更新:非常感谢下面的海报,但是现在它抛出了以下错误:

ProgrammingError: (ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') ORDER BY tblclients.clientname' at line 3") 'SELECT favourites.id AS favourites_id, favourites.userid AS favourites_userid, favourites.clientid AS favourites_clientid, favourites.last_visit AS favourites_last_visit \nFROM favourites INNER JOIN tblclients ON tblclients.clientid = favourites.clientid \nWHERE favourites.userid = %s ORDER BY tblclients.clientname' ([u'41'],)

有任何想法吗?

4

4 回答 4

19

首先,您必须使用filter_by,而不是filter

其次,Flaskrequest.args使用 MultiDict,一个包含列表中值的字典,允许同一个键有多个值,因为同一个字段可以在查询字符串中出现多次。你得到了错误,因为 SQL 查询得到了[u'41']它预期的时间'41'。您可以使用它request.args.to_dict()来解决这个问题:

model.query.filter_by(**request.args.to_dict()).all()
于 2013-11-01T21:00:03.900 回答
4

使用filter_by

model.query.filter_by(**request.args).all()

filter像这样使用:query.filter(Class.property == value)whilefilter_by 像这样使用:(query.filter_by(property=value)第一个是表达式,后一个是关键字参数)。

于 2013-10-30T11:44:46.893 回答
2

filter_by(**request.args)如果您有非模型查询参数(例如page分页),则效果不佳,否则您会收到如下错误:

InvalidRequestError: Entity '<class 'flask_sqlalchemy.JobSerializable'>' has no property 'page'

我使用这样的东西忽略不在模型中的查询参数:

    builder = MyModel.query
    for key in request.args:
        if hasattr(MyModel, key):
            vals = request.args.getlist(key) # one or many
            builder = builder.filter(getattr(MyModel, key).in_(vals))
    if not 'page' in request.args:
        resources = builder.all()
    else:
        resources = builder.paginate(
            int(request.args['page'])).items

考虑一个带有名为 列的模型valid,这样的事情会起作用:

curl -XGET "http://0.0.0.0/mymodel_endpoint?page=1&valid=2&invalid=whatever&valid=1"

invalid将被忽略,并且page可用于分页,最重要的是,将生成以下 SQL:WHERE mymodel.valid in (1,2)

(如果您使用此样板保存模​​块,则免费获取上述代码段)

于 2015-01-02T12:42:22.893 回答
1

你可以:

http://localhost:5000/filter-test?var=test

query_dict = request.args.to_dict()

print(query_dict)
{'var': 'test'}

print(query_dict['var'])
var
于 2021-09-23T18:22:10.963 回答