Saltar al contenido

filtrado dinámico de sqlalchemy

Encontramos el arreglo a esta cuestión, o por lo menos eso esperamos. Si continuas con dudas puedes escribirlo en el apartado de comentarios y con placer te responderemos

Solución:

Su problema es que filter_by toma argumentos de palabras clave, pero el filtro toma expresiones. Entonces, expandir un dict para filter_by **mydict funcionará. Con el filtro, normalmente le pasa un argumento, que resulta ser una expresión. Entonces, cuando expande su dictado de ** filtros para filtrar, pasa filtrar un montón de argumentos de palabras clave que no entiende.

Si desea crear un conjunto de filtros a partir de un dict de argumentos de filtro almacenados, puede usar la naturaleza generativa de la consulta para seguir aplicando filtros. Por ejemplo:

# assuming a model class, User, with attributes, name_last, name_first
my_filters = 'name_last':'Duncan', 'name_first':'Iain'
query = session.query(User)
for attr,value in my_filters.iteritems():
    query = query.filter( getattr(User,attr)==value )
# now we can run the query
results = query.all()

Lo mejor del patrón anterior es que puede usarlo en múltiples columnas unidas, puede construir ‘y’ y ‘or’ con and_ y or_, puede hacer <= o comparaciones de fecha, lo que sea. Es mucho más flexible que usar filter_by con palabras clave. La única advertencia es que para las uniones debe tener un poco de cuidado de no intentar accidentalmente unirse a una tabla dos veces, y es posible que deba especificar la condición de unión para un filtrado complejo. Utilizo esto en un filtrado muy complejo sobre un modelo de dominio bastante complicado y funciona de maravilla, solo mantengo un dictado de entidades unidas para realizar un seguimiento de las uniones.

Tengo un problema similar, traté de filtrar desde un diccionario:

filters = "field": "value"

Equivocado:

...query(MyModel).filter(**filters).all()

Bueno:

...query(MyModel).filter_by(**filters).all()

Al final de la página puedes encontrar las críticas de otros creadores, tú igualmente tienes la opción de mostrar el tuyo si te gusta.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *