如何在SQLAlchemy中创建自定义filter_by
我想创建一个稍微复杂一点的 filter_by
,也就是说,如果我传递一些参数和对应的值,而其中有些值是 None
(也就是没有值),那么这些就不应该被包含在过滤条件里。我不太确定怎么在全局范围内重写 filter_by
。
实际上,我想要的效果是:
data = {'is_enabled': True, 'city': 'SF', 'address': None}
query.smart_filter(data)
而 smart_filter 会排除掉 'address' 字段,并且用 'is_enabled' 和 'city' 的值来调用 filter_by。
有没有什么办法可以实现这样的功能呢?
1 个回答
5
你可以创建一个新的类,这个类是从 sqlalchemy.orm.Query
这个类派生出来的。在这个新类里,添加一个叫 smart_filter
的方法。然后,把这个新类传给你的 sessionmaker
。大概就是这样的意思:
class MyQuery(Query):
def smart_filter(self, **kwargs):
kwargs = {key: value for key, value in kwargs.items()
if value is not None}
return self.filter_by(**kwargs)
Session = sessionmaker(query_cls=MyQuery)