Подтвердить что ты не робот

SQLAlchemy - динамически строит фильтр запросов из dict

Итак, у меня есть указатель, переданный с веб-страницы. Я хочу построить запрос динамически на основе dict. Я знаю, что могу:

session.query(myClass).filter_by(**web_dict)

Однако это работает только тогда, когда значения являются точными. Мне нужно сделать "как" фильтрацию. Моя лучшая попытка с использованием атрибута __dict__:

for k,v in web_dict.items():
    q = session.query(myClass).filter(myClass.__dict__[k].like('%%%s%%' % v))

Не уверен, как построить запрос оттуда. Любая помощь будет потрясающей.

4b9b3361

Ответ 1

Вы на правильном пути!

Первое, что вы хотите сделать, - это атрибуты доступа с помощью getattr, а не __dict__; getattr всегда будет делать правильные вещи, даже если (как это может иметь место для более запутанных моделей) сопоставленный атрибут не является свойством столбца.

Другой недостающий элемент состоит в том, что вы можете указать filter() более одного раза и просто заменить старый объект запроса результатом этого вызова метода. Итак, в основном:

q = session.query(myClass)
for attr, value in web_dict.items():
    q = q.filter(getattr(myClass, attr).like("%%%s%%" % value))