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

Posted

技术标签:

【中文标题】使用 python 在 Django 中进行高级搜索【英文标题】:Advanced search in Django using python 【发布时间】: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's contains查询方法呢? 【参考方案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 函数。 问题已解决并正常运行!非常感谢!

以上是关于使用 python 在 Django 中进行高级搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用 django ORM 进行高级选择

django 高级

Django:用于轻松安全 Web 开发的高级 Python Web 框架

Django:用于轻松安全 Web 开发的高级 Python Web 框架

python 3.5 django 笔记(七)高级admin

商品搜素