2011-09-30 4 views
25

Así que tengo un dict pasado de una página web. Quiero construir la consulta de forma dinámica en función del dict. Sé que puedo hacer:SQLAlchemy - filtro de consultas de compilación dinámicamente desde dict

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

Sin embargo, eso solo funciona cuando los valores son una coincidencia exacta. Necesito hacer 'me gusta' filtrar. Mi mejor intento de utilizar el atributo __dict__:

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

No estoy seguro de cómo construir la consulta a partir de ahí. Cualquier ayuda sería increíble.

Respuesta

38

¡Está en el camino correcto!

Lo primero que desea hacer diferente es acceder a los atributos usando getattr, no __dict__; getattr siempre hará lo correcto, incluso cuando (como puede ser el caso de modelos más intrincados) un atributo mapeado no es una propiedad de columna.

La otra pieza que falta es que puede especificar filter() más de una vez, y simplemente reemplace el objeto de la consulta anterior con el resultado de esa llamada al método. Así que, básicamente:

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

TokenMacGuy ataca de nuevo. Cue la música ... – MFB

+1

Lol, me lleva de vuelta ... :) – MFB

+3

por favor, no spam en el comentario ..! – PersianGulf

Cuestiones relacionadas