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"
我有一个名为 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"