【问题标题】:Advanced search in Django using python使用 python 在 Django 中进行高级搜索
【发布时间】:2018-08-27 10:17:24
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

您可以在 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)

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

【讨论】:

  • 非常感谢您的帮助!但是当我将此代码复制到我的项目时,结果发现没有定义“reduce”。我还应该做些什么来解决这个问题?
  • 您使用的是什么版本的 Python?如果您使用的是 Python 3.5 或更高版本,则应使用from functools import reduce,如上例所示。否则可以省略导入,Python 将使用内置的reduce 函数。
  • 问题已解决并正常运行!非常感谢!
猜你喜欢
  • 2013-08-12
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
相关资源
最近更新 更多