Как отфильтровать два атрибута в SQLAlchemy

#python #flask #filter #sqlalchemy #flask-sqlalchemy

Вопрос:

Я хочу знать, могу ли я создать только один запрос с помощью Flask SQLAlchemy, который предоставит мне все строки из одной таблицы с двумя атрибутами Id и именем, но примерно так: если я не определяю атрибуты, он возвращает мне все строки таблицы, если я определяю идентификатор, он возвращает строку с этим идентификатором, если я определяю имя, он возвращает строки с этим именем, и если я определяю оба, он возвращает строку с этими атрибутами.

Это должно выглядеть примерно так:

 Table.query.filter ( _or(Table.id==id, Table.name==name ).all()
 

Ответ №1:

Чтобы делать именно то, что вы хотите , в частности извлекать все, когда есть поле фильтра None , одним из решений может быть создание функции для этого:

 def search(Table, **kwargs):
    if not kwargs:
        return db.query(Table).all()
    filters = {k: v for k, v in kwargs.items() if v is not None}
    return db.query(Table).filter_by(**filters).all()
 

Предполагая db , что это ваш объект сеанса SQLAlchemy

Тогда вы можете использовать его вот так:

 search(YourModel) # fetch everything
search(YourModel, name=None) # fetch everything
search(YourModel, name='Hello') # fetch all YourModel with name='Hello'
search(YourModel, name='Hello', id=123) # fetch all YourModel with name='Hello' and id=123