下面是实现 Django admin 的 search_fields
完整攻略:
1. 在 ModelAdmin 中配置 search_fields
在 Django 中,我们可以通过 ModelAdmin 对象来配置 search_fields
属性实现模糊查询,但是使用该属性执行的是 SQL 中 LIKE 操作,未做查询词的规范化。
如果我们希望在 Django admin 中实现精确查询,则需要重写 ModelAdmin 中的 get_search_results
方法。步骤如下:
- 创建自定义的
ModelAdmin
类,继承 Django 提供的admin.ModelAdmin
- 在自定义的
ModelAdmin
类中重写get_search_results
方法 - 在
get_search_results
方法中,使用原有的模糊查询语句进行查询,然后过滤出符合精确查询条件的结果,返回结果给前端即可
示例代码:
from django.contrib import admin
from myapp.models import Book
class BookAdmin(admin.ModelAdmin):
search_fields = ('title', 'author', 'publisher', 'category')
def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super().get_search_results(request, queryset, search_term)
# 对所有查询词使用精确匹配
for term in search_term.split():
queryset = queryset.filter(title__iexact=term)
queryset = queryset.filter(author__iexact=term)
queryset = queryset.filter(publisher__iexact=term)
queryset = queryset.filter(category__iexact=term)
return queryset, use_distinct
admin.site.register(Book, BookAdmin)
在上面的代码中,我们创建了 BookAdmin
类,并重写了 get_search_results
方法,对查询词使用精确匹配。这意味着,例如搜索 Programming in Python
关键词时,该方法仅会返回保存 title
或 author
或 publisher
或 category
准确为 Programming in Python
的结果。
2. 自定义模糊查询的边界
以上示例的方法是对所有查询词都使用精确匹配,这样会抛弃掉模糊匹配的优点,对于一些场合,我们需要使用一些边界来处理模糊匹配。
例如,假设我们要搜索以给定字符串起始的字符串,我们可以使用以下示例代码:
from django.contrib import admin
from myapp.models import Book
class BookAdmin(admin.ModelAdmin):
search_fields = ('title', 'author', 'publisher', 'category')
def get_search_results(self, request, queryset, search_term):
queryset, use_distinct = super().get_search_results(request, queryset, search_term)
# 对所有查询词使用边界规则匹配
for term in search_term.split():
lookup = '__startswith'
if term.endswith('*'):
term = term[:-1]
else:
lookup = '__iexact'
queryset = queryset.filter(title + lookup=term)
queryset = queryset.filter(author + lookup=term)
queryset = queryset.filter(publisher + lookup=term)
queryset = queryset.filter(category + lookup=term)
return queryset, use_distinct
admin.site.register(Book, BookAdmin)
在上述代码中,我们通过增加一个 lookup
变量,并根据情况使用 __iexact
或 __startswith
进行模糊查询。例如搜索字符串 Python*
时会使用前缀匹配来寻找以 Python
开头的字符串.
以上就是 Django admin 实现 search_fields
精确查询的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django admin 实现search_fields精确查询实例 - Python技术站