2012-01-17 32 views
9

¿Hay alguna manera de tomar una lista de expresiones de consulta de django (por ejemplo, Q(first_name="Jordan"), donde Q es django.db.models.Q) y O BIEN juntas?Lista de Python para operaciones bit a bit

En otras palabras, tengo algo como esto:

search_string = "various search terms" 

Y yo quiero hacer esto:

search_params = [Q(description__icontains=term) for term in re.split(r'\W', search_string)] 
search_params = something_magical(search_params) 
results = Record.objects.filter(search_params) 

donde search_params ahora es equivalente a Q(description__icontains="various") | Q(description__icontains="search" | Q(description__icontains="terms"

Sé que sería ser posible con una función como esta:

def something_magical(lst): 
    result = lst[0] 
    for l in lst[1:] 
     result |= l 
    return result 

Me pregunto si esta funcionalidad ya está incorporada en Python (y supongo que está más optimizada que mi función aquí).

Aunque estoy interesado en esta aplicación, también me interesa teóricamente.

+0

No creo que haya un operador tan django ... ¿Pero podría hacer todas las consultas "o" y luego usar los operadores de conjunto de pitones para combinar los resultados? (http://docs.python.org/library/sets.html#set-objects) –

+0

@RichardGreen que puede crear consultas bastante feas –

Respuesta

19

es probable que desee

import operator 
from functools import reduce # Python 3 
search_params = reduce(operator.or_, search_params, Q()) 

Esto colocará un bit a bit o (|) entre todos los elementos de search_params, a partir de una condición de vacío Q().

+0

¡Agradable! Cosas como esta hacen que mi amor python sea cada vez más. –

+0

Acabo de pasar un rato jugando con 'reducir' y' mapa'. –

+0

¡Te gusta! Probablemente también disfrutará de [itertools] (http://docs.python.org/library/itertools.html). –

Cuestiones relacionadas