gpt4 book ai didi

python - SQLAlchemy - 你可以向查询对象添加自定义方法吗?

转载 作者:IT老高 更新时间:2023-10-28 20:32:17 32 4
gpt4 key购买 nike

有没有办法为查询对象创建自定义方法,以便您可以执行此类操作?

User.query.all_active()

all_active() 本质上是 .filter(User.is_active == True)

并且能够过滤掉它?

User.query.all_active().filter(User.age == 30)

最佳答案

你可以继承 Query 基类来添加你自己的方法:

from sqlalchemy.orm import Query

class MyQuery(Query):

def all_active(self):
return self.filter(User.is_active == True)

然后在创建 session 时告诉 SQLAlchemy 使用这个新的查询类 (docs here)。从您的代码看来,您可能正在使用 Flask-SQLAlchemy,因此您可以按如下方式进行:

db = SQLAlchemy(session_options={'query_cls': MyQuery})

否则,您会将参数直接传递给 sessionmaker:

sessionmaker(bind=engine, query_cls=MyQuery)

截至目前,这个新的查询对象并不那么有趣,因为我们在方法中硬编码了 User 类,所以它不能用于其他任何东西。更好的实现将使用查询的底层类来确定应用哪个过滤器。这有点棘手,但也可以做到:

class MyOtherQuery(Query):

def _get_models(self):
"""Returns the query's underlying model classes."""
if hasattr(query, 'attr'):
# we are dealing with a subquery
return [query.attr.target_mapper]
else:
return [
d['expr'].class_
for d in query.column_descriptions
if isinstance(d['expr'], Mapper)
]

def all_active(self):
model_class = self._get_models()[0]
return self.filter(model_class.is_active == True)

最后,动态关系(如果有的话)不会使用这个新的查询类。为了让那些也使用它,您可以在创建关系时将其作为参数传递:

users = relationship(..., query_class=MyOtherQuery)

关于python - SQLAlchemy - 你可以向查询对象添加自定义方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936111/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com