Динамически создаваемые фильтры в SQLAlchemy
Я ищу способ динамически создавать фильтры с использованием SQLAlchemy. То есть, учитывая столбец, имя оператора и сравниваемое значение, создайте соответствующий фильтр.
Я попытаюсь проиллюстрировать это на примере (это будет использовано для построения API). Допустим, у нас есть следующая модель:
class Cat(Model):
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
Я хотел бы отобразить запросы на фильтры. Например,
/cats?filter=age;eq;3
должен генерироватьCat.query.filter(Cat.age == 3)
/cats?filter=age;in;5,6,7&filter=id;ge;10
должен генерироватьCat.query.filter(Cat.age.in_([5, 6, 7])).filter(Cat.id >= 10)
Я оглянулся вокруг, чтобы увидеть, как это было сделано, но не смог найти способ, который бы не предусматривал ручное сопоставление имени каждого оператора для компаратора или чего-то подобного. Например,Колба-Restless хранит словарь всех поддерживаемых операций и сохраняет соответствующие лямбда-функции (код здесь).
Я искал в документах по SQLAlchemy и нашел два потенциальных клиента, но ни одно из них не показалось удовлетворительным:
с помощьюColumn.like
, Column.in_
...: эти операторы доступны непосредственно в столбце, что упрощает использованиеgetattr
но некоторые все еще отсутствуют (==
, >
, и т.д.).
с помощьюColumn.op
Например,Cat.name.op('=')('Hobbes')
но это не похоже на работу для всех операторов (in
а именно).
Есть ли чистый способ сделать это безlambda
функции?