2011-09-30 17 views
25

Więc mam dyktat przeszedł ze strony internetowej. Chcę zbudować zapytanie dynamicznie w oparciu o dyktando. Wiem, że mogę:SQLAlchemy - dynamicznie generuj filtr zapytań od dyktowania

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

Działa to jednak tylko wtedy, gdy wartości są dokładnie dopasowane. Muszę "polubić" filtrowanie. Moja najlepsza próba przy użyciu atrybutu __dict__:

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

Nie wiesz, jak zbudować kwerendę stamtąd. Każda pomoc będzie niesamowita.

Odpowiedz

38

Jesteś na dobrej drodze!

Pierwszą rzeczą, którą chcesz zrobić, to atrybuty dostępu przy użyciu getattr, a nie __dict__; getattr zawsze zrobi to, co trzeba, nawet gdy (jak może być w przypadku bardziej skomplikowanych modeli) zmapowany atrybut nie jest właściwością kolumny.

Innym brakującym elementem jest to, że możesz określić filter() więcej niż raz i po prostu zastąpić stary obiekt zapytania wynikiem tego wywołania metody. Zasadniczo:

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

TokenMacGuy ponownie uderza. Cue the music ... – MFB

+1

Lol, zabiera mnie ... :) – MFB

+3

proszę nie spamuj w komentarzu ..! – PersianGulf

Powiązane problemy