Динамически создаваемые фильтры в 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 функции?

Ответы на вопрос(3)

Ваш ответ на вопрос