Django ORM拆分名称和搜索

Django ORM split the name and search

我有一个名为 Suburb 的模型。有一个名为名称的字段。

郊区的名称可以是多个单词"East west country"。我想要所有部分单词以给定字符串开头的记录。

class Suburb(models.Model):
    name = models.CharField(_('suburb name'), blank=False, max_length=200)

search_string = "we"

# Give me all records whose part words starts with "search_string"

Suburb.objects.filter(...) # with ignore case ??? 

Example 
----------
1) "East west one"
2) "We east two"
3) "North south three"

result should be 1) and 2) 

我有一个 pythonic 解决方案。但是它的性能很差。

DB = MYSQL

提前致谢

无需参与的最佳 Django 解决方案 Full Text Search or search engine would be to use icontains

所以在你的情况下

Suburb.objects.filter(name__icontains=search_string)

编辑:每个单词的开头使用正则表达式:

对于mysql [[:<:]]表示单词的开头

所以这样的事情就是解决方案

Suburb.objects.filter.(name__iregex=r'[[:<:]]' + re.escape(search_string)

另请注意,以下解决方案无法扩展,因为存在通配符正则表达式

您可以使用 istartswith and icontains with the Q object

的组合
search_string = 'we'
Sample.objects.filter(Q(name__istartswith=search_string) | Q(name__icontains=' ' + search_string))

使用此解决方案,我假设您的文字始终由 space 字符分隔。

使用 iregex 过滤器作为另一个可以使用的选项,但我没有创建示例。

按部分词搜索:

search_string = "we"
Suburb.objects.filter(name__icontains = search_string)
    Result:
    1) "East west one"
    2) "We east two"

从起始词搜索:

search_string = "we"
Suburb.objects.filter(name__startswith = search_string)
    Result:
    2) "We east two"

搜索确切的作品:

search_string = "we"
Suburb.objects.filter(name__iexact = search_string)
Result: no result
search_string = "We east two"
Result:
2) "We east two"