2010-11-10 11 views
6

estoy poniendo en práctica un simple búsqueda como en mi sitio web Django y lo que yo uso actualmente es el siguiente código:Django SQL OR vía filtro() y Q(): ¿Dinámico?

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

Dónde query es una cadena. Esto da como resultado una declaración SQL LIKE y funciona bastante bien. Ahora también me gustaría dividir mi consulta de búsqueda en términos o palabras:

words = query.split(' ') 

Así words ahora contiene una lista de palabras, y me gustaría conseguir una sentencia SQL similar a:

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

Y en caso de que haya más de dos palabras, me gustaría que la declaración crezca enumerando todas las entradas por cada palabra.

¿Alguna idea? ¡Gracias!

+1

No olvides sanitizar tus consultas o estarás en la misma situación que la escuela de Boby Table. –

+1

¿qué hay de usar la búsqueda de texto completo con djapian? – Ski

+0

@the_drow: Django (o más correctamente, DB-API) se ocupa de eso ya. –

Respuesta

11
reduce(operator.or_, sequence_of_Q_objects) 
+0

Ah, perdón por los comentarios, error tipográfico allí. Remoto. Esto parece funcionar, muchas gracias, no sabía si esta función reduce() y operator.or_ – kovshenin

+1

'reduce (lambda: q, w: q | Q (... = w), query.split (''), Q()) ', tal vez demasiado complejo para un trazador de líneas sin embargo. – Ski

Cuestiones relacionadas