operador or_ puede ser útil en caso de número desconocido de O componentes de consulta.
Por ejemplo, supongamos que estamos creando un servicio REST con algunos filtros opcionales, que debería devolver el registro si alguno de los filtros devuelve verdadero. Por otro lado, si el parámetro no se definió en una solicitud, nuestra consulta no debería cambiar. Sin or_ función tenemos que hacer algo como esto:
query = Book.query
if filter.title and filter.author:
query = query.filter((Book.title.ilike(filter.title))|(Book.author.ilike(filter.author)))
else if filter.title:
query = query.filter(Book.title.ilike(filter.title))
else if filter.author:
query = query.filter(Book.author.ilike(filter.author))
Con or_ función puede ser reescrita para:
query = Book.query
not_null_filters = []
if filter.title:
not_null_filters.append(Book.title.ilike(filter.title))
if filter.author:
not_null_filters.append(Book.author.ilike(filter.author))
if len(not_null_filters) > 0:
query = query.filter(or_(*not_null_filters))
Tenga en cuenta que este enfoque es compatible con generadores que utilizan, por lo que si usted tiene una larga lista de cosas a O, que puede hacer 'filtro (or_ (v == User.name para v in ('Alice', 'Bob', 'Carl'))) ' – robru
@ El consejo de Robru es innecesariamente ineficiente. Si ya tiene una colección, debe usar el operador 'in_' como este:' filter (User.name.in _ (['Alice', 'Bob', 'Carl'])) ' – intgr
Ah, gracias, no estaba al tanto sqlalchemy tenía ese filtro – robru