2017-09-30 4 views
1

J'ai donc trouvé un moyen d'utiliser _unaccent et _search ensemble dans les filtres Django, mais j'essaie de trouver un moyen de l'implémenter correctement dans la barre de recherche dans les pages d'administration. Jusqu'à présent, j'ai le code suivant, mais comme je ne l'ai pas fait correctement, les paramètres d'administration tels que search_fields = [] ne s'appliquent pas correctement. J'apprécierais que quelqu'un puisse m'aider à fusionner ma solution avec l'implémentation originale de Django.Django _unaccent et _search in Admin

fonction admin.ModelAdmin être écrasé:

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 

Mon code:

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

Répondre

1

Ce que j'ai compris de votre question, c'est que vous voulez que search_fields et _unaccent search travaillent ensemble. Je ne suis pas sûr si j'ai bien compris votre question ou non.

Voici la solution pour ce que je compris:

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 

Laissez-moi savoir, si vous vouliez autre chose.

+0

A travaillé parfaitement - merci! – Hybrid