一尘不染

带关键字作为变量的flask sqlalchemy查询

flask

假设我有一个这样的模型:

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    hometown = db.Column(db.String(140))
    university = db.Column(db.String(140))

为了从纽约获得用户列表,这是我的查询:

User.query.filter_by(hometown='New York').all()

为了获得去USC的用户列表,这是我的查询:

User.query.filter_by(university='USC').all()

为了获得纽约的用户列表以及去过南加州大学的用户,这是我的查询:

User.query.filter_by(hometown='New York').filter_by(university='USC').all()

现在,我想基于变量的值动态生成这些查询。

例如,我的变量可能如下所示:

    {'hometown': 'New York'}

或像这样:

    {'university': 'USC'}

…甚至像这样:

    [{'hometown': 'New York'}, {'university': 'USC'}]

您能帮我编写一个将字典(或词典列表)作为输入,然后动态构建正确的sqlalchemy查询的函数吗?

如果我尝试为关键字使用变量,则会出现以下错误:

key = 'university'
User.query.filter_by(key='USC').all()

InvalidRequestError: Entity '<class 'User'>' has no property 'key'

其次,我不确定如何将多个filter_by表达式动态链接在一起。

我可以显式地调用filter_by表达式,但是如何基于变量将多个链接在一起?

希望这更有意义。


阅读 1109

收藏
2020-04-05

共1个答案

一尘不染

SQLAlchemy的filter_by采用关键字参数:

filter_by(** kwargs)

换句话说,该函数将允许你为它提供任何关键字参数。这就是为什么可以在代码中使用任何关键字的原因:SQLAlchemy基本上将参数视为值的字典。有关关键字参数的更多信息,请参见Python教程。

这样,SQLAlchemy的开发人员就可以以字典形式接收任意一堆关键字参数。但是,你要求的却相反:你可以将任意一堆关键字参数传递给函数吗?

事实证明,在Python中,你可以使用称为unpacking的功能。只需创建参数字典并将其传递给以开头的函数**,如下所示:

kwargs = {'hometown': 'New York', 'university' : 'USC'}
User.query.filter_by(**kwargs)
# This above line is equivalent to saying...
User.query.filter_by(hometown='New York', university='USC')
2020-04-05