首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_unaccent与_search在行政管理中的应用

_unaccent与_search在行政管理中的应用
EN

Stack Overflow用户
提问于 2017-09-30 01:29:23
回答 1查看 529关注 0票数 1

因此,我找到了在Django过滤器中使用_unaccent_search的方法,但我正在设法将其正确地实现到管理页面中的搜索栏中。到目前为止,我有以下代码,但是由于我没有正确地执行它,管理设置(如search_fields = [] )没有正确应用。如果有人能帮助我将我的解决方案与最初的Django实现合并,我将不胜感激。

被覆盖的admin.ModelAdmin函数:

代码语言:javascript
复制
def get_search_results(self, request, queryset, search_term):
    """
    Returns a tuple containing a queryset to implement the search,
    and a boolean indicating if the results may contain duplicates.
    """
    # Apply keyword searches.
    def construct_search(field_name):
        if field_name.startswith('^'):
            return "%s__istartswith" % field_name[1:]
        elif field_name.startswith('='):
            return "%s__iexact" % field_name[1:]
        elif field_name.startswith('@'):
            return "%s__search" % field_name[1:]
        else:
            return "%s__icontains" % field_name

    use_distinct = False
    search_fields = self.get_search_fields(request)
    if search_fields and search_term:
        orm_lookups = [construct_search(str(search_field))
                       for search_field in search_fields]
        for bit in search_term.split():
            or_queries = [models.Q(**{orm_lookup: bit})
                          for orm_lookup in orm_lookups]
            queryset = queryset.filter(reduce(operator.or_, or_queries))
        if not use_distinct:
            for search_spec in orm_lookups:
                if lookup_needs_distinct(self.opts, search_spec):
                    use_distinct = True
                    break

    return queryset, use_distinct

我的代码:

代码语言:javascript
复制
def get_search_results(self, request, queryset, search_term):  # TODO: Make this more professionally implemented (proper overrides)
    """ Overrides default search completely to incorporate __search and __unaccent lookups """
    use_distinct = False

    if search_term:  # Note: "if" condition necessary to show ALL results in admin if not search_term is specified (otherwise shows 0 results)
        queryset = queryset.annotate(unaccent_title=SearchVector('title', config='english_unaccent')).filter(unaccent_title=SearchQuery(search_term, config='english_unaccent'))

    return queryset, use_distinct

Django: 1.11.5 Python: 3.6.2

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-07 08:31:33

我从您的问题中了解到,您希望search_fields和_unaccent搜索一起工作。

我不确定我是否正确地理解了你的询问。

以下是我所理解的解决方案:

代码语言:javascript
复制
def get_search_results(self, request, queryset, search_term):  # TODO: Make this more professionally implemented (proper overrides)
    """ Overrides default search completely to incorporate __search and __unaccent lookups """
    queryset1, use_distinct = super(<Admin class>, self).get_search_results(request, queryset, search_term)

    queryset2 = queryset
    if search_term:  # Note: "if" condition necessary to show ALL results in admin if not search_term is specified (otherwise shows 0 results)
        queryset2 = queryset.annotate(unaccent_title=SearchVector(*self.search_fields, config='english_unaccent')).filter(unaccent_title=SearchQuery(search_term, config='english_unaccent'))

    return queryset1 | queryset2, use_distinct

如果你还想要什么就告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46498735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档