如何在SQLAlchemy中创建自定义filter_by

4 投票
1 回答
1035 浏览
提问于 2025-04-18 04:10

我想创建一个稍微复杂一点的 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)

撰写回答