2010-06-02 73 views
7

我正在使用過濾器圖標來搜索單詞,但我只希望它匹配整個單詞。例如如果我搜索肝臟,我不希望它返回交付。django過濾器圖標只匹配整個單詞

我的查詢看起來像這樣

MyModel.objects.filter(title__icontains=search_word) 

我已經看到了過濾器__search但這並不帶回3個字符以內,我是建設網站的搜索結果中含有大量的這些可能被搜索,例如'bbc'

我沒有訪問數據庫,但如果有人知道我可以在代碼中禁用此功能,那麼我會很樂意切換到使用此作爲替代。

+1

也許你可以使用[regex](http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex)來代替,或者在你的開始和結束處添加空格'search_word'字符串? – 2010-06-02 13:59:13

+0

我正在考慮添加空格,但如果標題只有一個單詞或該單詞出現在標題的開頭或結尾,那麼這將不起作用。我將如何通過正則表達式來做到這一點? – John 2010-06-03 08:34:44

回答

6

正則表達式通常就足夠了: http://docs.djangoproject.com/en/dev/ref/models/querysets/#regex

請注意,正則表達式語法的是,在使用的數據庫後端的。

在蟒蛇(源碼)的正則表達式是:

\b(word)\b 

在MySQL中,你有:

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

這與http://docs.djangoproject.com/en/dev/ref/models/querysets/#iregex一起解決了我的問題 – John 2010-11-30 14:55:57

-3

這聽起來像你想要一個不區分大小寫的精確匹配。

MyModel.objects.filter(title__iexact=search_word) 

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

+0

這不會工作,因爲我仍然想搜索字符串的一部分,但iexact需要整個字符串匹配。例如,如果我的標題是「這是一個測試標題」,如果我搜索'測試標題',我想查找這個。 – John 2010-06-03 08:33:29

+0

我明白了。你希望它找到'測試標題',但不是'est標題'。得到它了。 – 2010-06-03 11:37:49

+0

是的,沒錯。 – John 2010-06-03 12:46:29

0

如果你已經有或DRF實施和REST服務,您可以過濾整個單詞爲$http.get(uri, {'params': {'display_name__iregex': '[[:<:]]word[[:>:]]'})

當然,display_name應該啓用過濾在Tastypie resour ce的Meta類爲filtering = {'display_name': ALL,}