我目前正在研究django。现在,我希望实现高级搜索,更具体地说,使用不精确的关键词实现精确搜索。
例如,当我输入'a$c'
时,所有匹配结果都是'ac'
,'abc'
,'a!c'
,'Ac'
,'AC'
等等。基本上,'$(或可能是其他字符)'可以是数字,可以是字母或什么也不是。有没有办法做到这一点?
顺便说一下,我实现基本搜索功能的代码如下:
class MetaboliteAdmin(admin.ModelAdmin):
search_fields = ['id', 'name', 'compartment', 'charge', 'formula']
class ReactionAdmin(admin.ModelAdmin):
search_fields = ['id', 'name','metabolites', 'gene_reaction_rule', 'subsystem']
class GeneAdmin(admin.ModelAdmin):
search_fields = ['id', 'name', '']
答案 0 :(得分:2)
您可以覆盖ModelAdmin
类中的get_search_results()
,以便更好地控制对象搜索功能。
下面的示例使用Django的iregex
查找在指定$
字符时对所有search_fields进行不区分大小写的搜索。它基本上用$
取代.*
,它是“任何字符,零次或多次”的正则表达式。
from functools import reduce
from django.db.models import Q
class MetaboliteAdmin(admin.ModelAdmin):
search_fields = ['id', 'name', 'compartment', 'charge', 'formula']
def get_search_results(self, request, queryset, search_term):
if '$' in search_term:
search_term = search_term.replace('$', '.*')
return queryset.filter(reduce(lambda x, y: x | y,
[Q(**{'{}__iregex'.format(field): search_term})
for field in self.search_fields])), True
return super().get_search_results(request, queryset, search_term)
如果未指定$
字符,则搜索功能将正常运行。