我正在尝试使用与Django在管理页面中使用的相同搜索引擎来在我的自定义视图中显示结果。
我发现this website建议使用以下代码:
from django.db.models import Q
from django.db.models.query import QuerySet
import operator
def django_admin_keyword_search(model, keywords, base_qs=None):
"""Search according to fields defined in Admin's search_fields"""
if not keywords:
return []
fields = model._meta.admin.search_fields
qs = QuerySet(model)
for keyword in keywords:
or_queries = [Q(**{'%s__icontains' % field: keyword}) for field in fields]
if base_qs is None:
other_qs = QuerySet(model)
else:
other_qs = base_qs
if qs._select_related:
other_qs = other_qs.select_related()
other_qs = other_qs.filter(reduce(operator.or_, or_queries))
qs = qs & other_qs
return qs
def do_keyword_search(model, query, base_qs=None):
return django_admin_keyword_search(model, query.split(' '),
base_qs=base_qs)
但是如果没有在这段代码中获得属性错误('选项'对象没有属性'admin'),我就无法运行:fields = model._meta.admin.search_fields
修改 使用管理默认搜索引擎我做错了什么?
这是使用默认管理搜索引擎的其他任何方式吗?
答案 0 :(得分:1)
我设法构建了自己的通用搜索,就像管理搜索一样。课程如下:
from django.db.models import Q
from django.db.models.query import QuerySet
import operator
def django_admin_keyword_search(model, keywords, search_fields):
"""Search according to fields defined in Admin's search_fields"""
all_queries = None
for keyword in keywords.split(' '): #breaks query_string into 'Foo' and 'Bar'
keyword_query = None
for field in search_fields:
each_query = Q(**{field+'__icontains':keyword})
if not keyword_query:
keyword_query = each_query
else:
keyword_query = keyword_query | each_query
if not all_queries:
all_queries = keyword_query
else:
all_queries = all_queries & keyword_query
result_set = model.objects.filter(all_queries).distinct()
return result_set
享受!!