2012-01-17 17 views
9

Esiste un modo per ottenere un elenco di query django espresso (ad esempio Q(first_name="Jordan"), dove Q è django.db.models.Q) e OR bit a bit insieme?Elenco Python per operazioni bit a bit

In altre parole, ho qualcosa di simile:

search_string = "various search terms" 

E io voglio fare questo:

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) 

dove search_params ora è equivalente a Q(description__icontains="various") | Q(description__icontains="search" | Q(description__icontains="terms"

so che sarebbe essere possibile con una funzione come questa:

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

Quindi mi chiedo se questa funzionalità è già integrata in Python (e presumo che sia più ottimizzata della mia funzione qui).

Anche se sono interessato a questa applicazione, anche a me interessa solo teoricamente.

+0

Non penso che ci sia un tale operatore di Django ... Ma potresti semplicemente fare tutte le "o" query e poi usare gli operatori di python set per combinare i risultati? (http://docs.python.org/library/sets.html#set-objects) –

+0

@RichardGreen che può creare query abbastanza brutte –

risposta

19

probabilmente avrete bisogno

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

Questo metterà un po '-saggio o (|) tra tutti gli elementi in search_params, a partire da una condizione di vuoto Q().

+0

Bello! Cose come questa rendono sempre più il mio amore pitone. –

+0

Abbiamo appena trascorso un po 'di tempo a giocare con 'reduce' e' mappa'. –

+0

Great you like it! Probabilmente godrai anche di [itertools] (http://docs.python.org/library/itertools.html). –

Problemi correlati