SQLAlchemy - построить фильтр запросов динамически от dict - PullRequest
33 голосов
/ 30 сентября 2011

Итак, у меня есть сообщение, переданное с веб-страницы. Я хочу, чтобы запрос строился динамически на основе 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))

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

1 Ответ

47 голосов
/ 30 сентября 2011

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

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

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

q = session.query(myClass)
for attr, value in web_dict.items():
    q = q.filter(getattr(myClass, attr).like("%%%s%%" % value))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...