如何在SQLAlchemy中创建自定义filter_by

tsu*_*dot 4 python sqlalchemy

我想创建一个稍微复杂一点的filter_by-这样,如果我传递了一些kwargs和值,其中一些是None,则这些不包含在过滤器中。我不确定如何filter_by全局覆盖。

我真正想要的是:

data = {'is_enabled': True, 'city': 'SF', 'address': None}
query.smart_filter(data)
Run Code Online (Sandbox Code Playgroud)

并且smart_filter排除“地址”字段,并使用“ is_enabled”和“ city”值调用filter_by。

有什么办法可以建立这样的东西吗?

ben*_*lme 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)
Run Code Online (Sandbox Code Playgroud)