使用python在Django中进行高级搜索

时间:2018-03-18 21:37:11

标签: django python-3.x search django-models django-queryset

我目前正在研究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', ''] 

1 个答案:

答案 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)

如果未指定$字符,则搜索功能将正常运行。