django过滤器icontains仅匹配整个单词

时间:2010-06-02 13:38:57

标签: django django-queryset

我正在使用过滤器icontains搜索单词,但我只想让它匹配整个单词。例如如果我搜索肝脏,我不希望它返回分娩。

我的查询看起来像这样

MyModel.objects.filter(title__icontains=search_word)

我已经看过过滤器__search,但这并没有带回3个字符或更少字符的结果,而我正在构建的网站包含很多可以搜索的结果,例如'BBC'

我无法访问数据库,但如果有人知道如何在代码中禁用它,那么我很乐意转而使用它作为替代方案。

3 个答案:

答案 0 :(得分:6)

Regexp通常就足够了: http://docs.djangoproject.com/en/dev/ref/models/querysets/#regex

请注意,正则表达式语法是正在使用的数据库后端的语法。

在python(sqlite)中,正则表达式为:

\b(word)\b

在Mysql中你有:

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

答案 1 :(得分:0)

如果您使用或DRF实施了和REST服务,则可以按整个单词过滤为$http.get(uri, {'params': {'display_name__iregex': '[[:<:]]word[[:>:]]'})

当然,应该启用display_name来过滤Tastypie资源的Meta类filtering = {'display_name': ALL,}

答案 2 :(得分:-3)

听起来你想要一个不区分大小写的完全匹配。

MyModel.objects.filter(title__iexact=search_word)

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