您可以对基@H_419_1@Query类进行子类化以添加自己的方法:
@H_419_1@from sqlalchemy.orm import Query class MyQuery(Query): def all_active(self): return self.filter(User.is_active == True)
然后,您可以在创建会话时告诉sqlAlchemy使用此新查询类(此处的文档)。从您的代码看来,您可能正在使用Flask- sqlAlchemy,因此您可以按照以下步骤进行操作:
@H_419_1@db = sqlAlchemy(session_options={'query_cls': MyQuery})
否则,您将参数直接传递给@H_419_1@sessionmaker:
@H_419_1@sessionmaker(bind=engine, query_cls=MyQuery)
到目前为止,这个新的查询对象并不那么有趣,因为我们@H_419_1@User在方法中对类进行了硬编码,因此它不能用于其他任何事情。更好的实现方式是使用查询的基础类来确定要应用的过滤器。这有点棘手,但也可以完成:
@H_419_1@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)
最后,动态关系不会使用此新查询类(如果有的话)。为了让那些人也可以使用它,可以在创建关系时将其作为参数传递:
@H_419_1@users = relationship(..., query_class=MyOtherQuery)