2011-09-30 15 views
25

Così ho passato un dettato da una pagina web. Voglio creare la query in modo dinamico in base al comando. So che posso fare:SQLAlchemy: crea dinamicamente il filtro di query da dict

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

Tuttavia, ciò funziona solo quando i valori sono una corrispondenza esatta. Devo fare il filtro "mi piace". Il mio miglior tentativo utilizzando l'attributo __dict__:

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

Non sei sicuro di come costruire la query da lì. Qualsiasi aiuto sarebbe fantastico.

risposta

38

Sei sulla strada giusta!

La prima cosa da fare è accedere agli attributi utilizzando getattr, non __dict__; getattr farà sempre la cosa giusta, anche quando (come può essere il caso per i modelli più contorti) un attributo mappato non è una proprietà di colonna.

L'altro pezzo mancante è che è possibile specificare filter() più di una volta e sostituire semplicemente il vecchio oggetto query con il risultato di tale chiamata di metodo. Quindi in pratica:

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

TokenMacGuy colpisce ancora. Cue the music ... – MFB

+1

Lol, mi riporta indietro ... :) – MFB

+3

per favore non spam nel commento ..! – PersianGulf

Problemi correlati