Я ищу способ динамически создавать фильтры с помощью 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)
Я огляделся, чтобы посмотреть, как это было сделано, но не смог найти способ, который не включал бы вручную сопоставление каждого имени оператора компаратору или что-то подобное. Например, Flask-Restless хранит словарь всех поддерживаемых операций и сохраняет соответствующие лямбда-функции (здесь)).
Я искал в документах SQLAlchemy и нашел два потенциальных вывода, но ни один из них не казался удовлетворительным:
-
используя
Column.like
,Column.in_
...: эти операторы доступны непосредственно в столбце, который упростит использованиеgetattr
, но некоторые из них все еще отсутствуют (==
,>
и т.д.)..). -
используя
Column.op
: например.Cat.name.op('=')('Hobbes')
, но это не работает для всех операторов (in
а именно).
Есть ли чистый способ сделать это без lambda
функций?