2010-11-10 13 views
6

Sto implementando una semplice ricerca come sul mio sito Django e quello che attualmente uso è il seguente codice:Django SQL OR tramite filtro() e Q(): dinamico?

from django.db.models import Q 
posts = Post.objects.filter(Q(title__icontains=query)|Q(content__icontains=query)) 

Dove query è una stringa. Ciò risulta in un'istruzione SQL LIKE e funziona abbastanza bene. Ora mi piacerebbe anche dividere la mia domanda di ricerca in termini o parole:

words = query.split(' ') 

Così words ora contiene una lista di parole, e mi piacerebbe ottenere un'istruzione SQL simile a:

SELECT ... FROM foo WHERE `title` ILIKE '%word1%' OR `title` ILIKE '%word2%' 
    OR `content` ILIKE '%word1%' OR `content` ILIKE '%word2%' 

E nel caso ci siano più di due parole mi piacerebbe che la dichiarazione crescesse elencando tutte le voci di ogni parola.

Qualche idea? Grazie!

+1

Non dimenticare di disinfettare le tue domande o ti troverai nella stessa situazione in cui si trovava la scuola di Boby Table. –

+1

Cosa ne pensi di usare la ricerca full-text con djapian? – Ski

+0

@the_drow: Django (o più correttamente, DB-API) si occupa già di questo. –

risposta

11
reduce(operator.or_, sequence_of_Q_objects) 
+0

Ah, scusami per il commento, errore di battitura lì. Rimosso. Questo sembra funzionare, grazie mille, non sapevo se questa funzione di riduzione() e operator.or_ – kovshenin

+1

'ridurre (lambda: q, w: q | Q (... = w), query.split (''), Q()) ', forse troppo complesso per un liner però. – Ski