2010-06-02 11 views
7

estoy usando los icontains de filtro para buscar palabras, pero sólo lo quieren para que coincida con las palabras enteras. p.ej. si busqué hígado no me gustaría que devuelva la entrega.icontains filtro Django coinciden con palabras completas

mi consulta es similar a esto

MyModel.objects.filter(title__icontains=search_word) 

he visto el filtro __search pero esto no traer de vuelta los resultados con 3 caracteres o menos y el sitio Soy edificio contiene una gran cantidad de éstos que podría ser buscado , p.ej 'BBC'

que no tienen acceso a la base de datos, pero si alguien sabe cómo puedo desactivar esto en el código entonces yo estaría feliz de pasar a utilizar esto como una alternativa.

+1

Quizás podría usar [regex] (http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex) en su lugar, o agregar espacios al inicio y al final de su 'search_word' string? –

+0

estaba pensando en añadir espacios pero si el título fue sólo 1 palabra o la palabra apareció al principio o al final del título, entonces esto no iba a funcionar. ¿Cómo lo haría a través de Regex? – John

Respuesta

6

Regexp son generalmente bastante: http://docs.djangoproject.com/en/dev/ref/models/querysets/#regex

Tenga en cuenta que la sintaxis de expresiones regulares es el de la base de datos back-end en uso.

en Python (sqlite) la expresión regular sería:

\b(word)\b 

en MySQL tiene:

mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]'; -> 1 
mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]'; -> 0 
+1

esto junto con http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex resuelto mi problema – John

-3

suena como desea una coincidencia exacta mayúsculas y minúsculas.

MyModel.objects.filter(title__iexact=search_word) 

http://docs.djangoproject.com/en/dev/ref/models/querysets/#lookup-iexact

+0

esto no funcionaría ya que aún quiero buscar parte de una cadena, pero iexact requiere que coincida toda la cadena. por ejemplo, si mi título era 'esto es una prueba de título' Yo querría encontrar esto si he buscado 'título de prueba' – John

+0

veo. Desea que encuentre 'título de prueba' pero no 'título est'. Lo tengo. –

+0

sí, eso es correcto. – John

0

En caso de que haya servicio y REST implementado con o DRF, puede filtrar por palabras completas como $http.get(uri, {'params': {'display_name__iregex': '[[:<:]]word[[:>:]]'})

por supuesto, display_name debe estar habilitado para filtrar en Tastypie resour clase meta de ce como filtering = {'display_name': ALL,}

Cuestiones relacionadas