Python 如果选择了facet,如何禁用-Django Haystack进行搜索

Python 如果选择了facet,如何禁用-Django Haystack进行搜索,python,django,solr,Python,Django,Solr,我在奥斯卡CMS项目中使用Django Haystack,我对它从搜索返回所选方面数据的方式有问题 当我没有在菜单中选择任何产品时,solr中面(项目类)的顺序是 但当我选择经典产品时,solr会将选定的方面移动到列表中的第一个位置,就像这样 所以它的变化顺序,这是一个问题-是否有可能阻止haystack改变初始数据-当没有选择查询/方面时,它们都是静态的!或者也许有其他的解决方法-请帮帮我 代码示例(首先是其HTML上下文数据处理程序): 代码示例(SearchForm本身) 类搜索表单(

我在奥斯卡CMS项目中使用Django Haystack,我对它从搜索返回所选方面数据的方式有问题

当我没有在菜单中选择任何产品时,solr中面(项目类)的顺序是

但当我选择经典产品时,solr会将选定的方面移动到列表中的第一个位置,就像这样

所以它的变化顺序,这是一个问题-是否有可能阻止haystack改变初始数据-当没有选择查询/方面时,它们都是静态的!或者也许有其他的解决方法-请帮帮我

代码示例(首先是其HTML上下文数据处理程序):


代码示例(SearchForm本身)


类搜索表单(FacetedSearchForm):

CodeSample(Haystack查询,到init facets搜索)



CodeSample(Haystack后端,用于获取方面)

代码示例(Solr_后端,acctual search):


请注意,-facet_counts-是一个实际的facet-当被选中时,数据将被重新排序


如果需要提供任何其他数据-请让我知道,我希望有人能在这方面帮助我,我坚持它-超过一个星期

您可以为没有当前方面的SearchQuerySet创建附加过滤器

您可以为没有当前方面的SearchQuerySet创建附加过滤器

T-Shirt
Classic
Classic
T-Shirt
 def get_search_context_data(self, context_object_name=None):

 context = {'form': self.search_form,
            'paginator':self.paginator,
            'page_obj': self.page}

 BrowseCategoryForm = get_class('search.forms', 'SearchForm')

 def __init__(self, request_data, full_path):
            self.choice_form = self.get_choice_form(request_data, search_queryset)

 def get_choice_form(self,request_data,search_queryset):
     form_class = BrowseCategoryForm
     data = self.results.facet_counts()['fields']['product_class']
     kwargs = {
                'data': request_data,
                'selected_facets': request_data.getlist("selected_facets"),
                'searchqueryset': search_queryset,
                'facet_counts':data
            }
     return form_class(**kwargs)
    def __init__(self, *args, **kwargs):
            self.facet_counts = kwargs.pop("facet_counts",[])
            super(SearchForm, self).__init__(*args, **kwargs)
    for field_value, count in self.facet_counts:
        choices=[]
        field_url = 'product_class_exact:%s' % field_value
        choices.append((field_url,field_value))
    self.fields['selected_facets'] = forms.ChoiceField(
            label=_("Sort by"), choices=choices,
            widget=forms.Select(), required=False)
def facet_counts(self):
    """
    Returns the facet counts found by the query.

    This will cause the query to execute and should generally be used when
    presenting the data.
    """
    if self.query.has_run():
        return self.query.get_facet_counts()
    else:
        clone = self._clone()
        return clone.query.get_facet_counts()
def get_facet_counts(self):
    """
    Returns the facet counts received from the backend.

    If the query has not been run, this will execute the query and store
    the results.
    """
    if self._facet_counts is None:
        self.run()
    return self._facet_counts

def run(self, spelling_query=None, **kwargs):
    """Builds and executes the query. Returns a list of search results."""
    final_query = self.build_query()
    search_kwargs = self.build_params(spelling_query=spelling_query)

    if kwargs:
        search_kwargs.update(kwargs)

    results = self.backend.search(final_query, **search_kwargs)
    print("results Run",results)
    self._results = results.get('results', [])
    self._hit_count = results.get('hits', 0)
    self._facet_counts = self.post_process_facets(results)
    self._spelling_suggestion = results.get('spelling_suggestion', None)
def search(self, query_string, **kwargs):
    if len(query_string) == 0:
        return {
            'results': [],
            'hits': 0,
        }

    search_kwargs = self.build_search_kwargs(query_string, **kwargs)
    try:
        raw_results = self.conn.search(query_string, **search_kwargs)
    except (IOError, SolrError) as e:
        if not self.silently_fail:
            raise

        self.log.error("Failed to query Solr using '%s': %s", query_string, e, exc_info=True)
        raw_results = EmptyResults()

    return self._process_results(raw_results, highlight=kwargs.get('highlight'), result_class=kwargs.get('result_class', SearchResult), distance_point=kwargs.get('distance_point'))