使用 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:用于轻松安全 Web 开发的高级 Python Web 框架
Django:用于轻松安全 Web 开发的高级 Python Web 框架