【问题标题】:Using Django Admin search engine in my own views在我自己的视图中使用 Django Admin 搜索引擎
【发布时间】:2014-02-03 22:41:35
【问题描述】:

我正在尝试使用与 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)

但我无法在这段代码中运行它而不会出现 Attribute Error ('Options' object has no attribute 'admin')fields = model._meta.admin.search_fields

编辑: 我在使用管理员默认搜索引擎时做错了什么?

这是使用默认管理员搜索引擎的任何其他方式吗?

【问题讨论】:

  • 请注意该链接上的日期:7 年前。那是 Django 1.0 之前的事了,而且管理员完全不同。

标签: python django search-engine admin attributeerror


【解决方案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

享受吧!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-18
    • 2014-05-29
    • 2016-12-31
    • 2015-11-27
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多