Flask - 将request.args转换为dict

Ben*_*lah 7 sqlalchemy flask flask-sqlalchemy

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

我认为这应该有效:

model.query.filter(**request.args).all()
Run Code Online (Sandbox Code Playgroud)

但它正在抛出错误:

TypeError: <lambda>() got an unexpected keyword argument 'userid'
Run Code Online (Sandbox Code Playgroud)

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

根据这篇文章 - /sf/ask/1365427381/ - 您可以将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'],)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Ped*_*eck 9

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

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

model.query.filter_by(**request.args.to_dict()).all()
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案.并添加到它:使用`request.args.to_dict()`是正确的,而`dict(request.args)`不是因为它将产生一个其值由列表组成的字典. (3认同)

jav*_*vex 4

使用filter_by

model.query.filter_by(**request.args).all()
Run Code Online (Sandbox Code Playgroud)

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