2010-06-02 15 views
7

Sto usando l'icona del filtro per cercare le parole ma voglio solo che corrisponda a parole intere. per esempio. se cercassi il fegato, non vorrei che restituisse la consegna.iconj del filtro django corrispondono solo a parole intere

mia domanda assomiglia a questo

MyModel.objects.filter(title__icontains=search_word) 

ho visto il filtro __search ma questo non riportare i risultati con o meno 3 personaggi e il sito sono edificio contiene un sacco di questi che possono essere cercate , per esempio 'bbc'

Non ho accesso al db ma se qualcuno sa come posso disabilitare questo nel codice allora sarei felice di passare a utilizzare questo come alternativa.

+1

Forse potresti usare [regex] (http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex), oppure aggiungere spazi all'inizio e alla fine del tuo stringa 'search_word'? –

+0

Stavo pensando di aggiungere spazi, ma se il titolo era solo 1 parola o la parola appariva all'inizio o alla fine del titolo, allora questo non avrebbe funzionato. Come lo fare tramite regex? – John

risposta

6

Regexp sono di solito sufficienti: http://docs.djangoproject.com/en/dev/ref/models/querysets/#regex

Si prega di notare che la sintassi delle espressioni regolari è quella del backend database in uso.

in python (SQLite) la regexp sarebbe:

\b(word)\b 

in MySQL si dispone:

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

insieme a http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex risolto il mio problema – John

-3

Sembra che si desideri una corrispondenza esatta senza distinzione tra maiuscole e minuscole.

MyModel.objects.filter(title__iexact=search_word) 

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

+0

questo non funzionerebbe poiché voglio ancora cercare una parte di una stringa, ma iexact richiede che l'intera stringa corrisponda. ad esempio se il mio titolo fosse "questo è un titolo di prova", vorrei trovarlo se ho cercato "titolo test" – John

+0

, vedo. Vuoi che trovi "test title" ma non "est title". Fatto. –

+0

sì è vero. – John

0

Nel caso abbiate un servizio e REST realizzato con o DRF, è possibile filtrare di parole intere come $http.get(uri, {'params': {'display_name__iregex': '[[:<:]]word[[:>:]]'})

ovviamente, display_name deve essere abilitato per filtrare in Resistenza di Tastypie ce's Meta class come filtering = {'display_name': ALL,}

Problemi correlati