2016-11-16 88 views
0

结果我目前使用Django 1.10.3,与elasticsearch后端的Django干草堆的搜索引擎,并DRF-草垛证明的意见。过滤DRF-草垛当前用户

一般的搜索已经很大,但我完全无法用当前用户对搜索结果进行过滤。

该指数是:

class SectionIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True, template_name="indexes/structure_text.txt") 
    pkey = indexes.IntegerField(model_attr='pk') 
    title = indexes.CharField() 

的视图(也包括HaystackSerializer,但其通用的,值得包括)。

class SectionSearchView(HaystackViewSet): 
    index_models = [Section] 
    serializer_class = SectionViewSerializer 
    pagination_class = None 
    filter_backend = SectionFilter 

    def get(self, request, *args, **kwargs): 
     return self.list(request, *args, **kwargs) 

    def filter_queryset(self, queryset): 
     queryset = super(HaystackGenericAPIView, self).filter_queryset(queryset) 
     return queryset.using('section') 

最后,过滤器:

class SectionFilter(HaystackFilter): 
    mine = django_filters.MethodFilter(action='get_mine') 

    class Meta: 
     model = Section 
     fields = ['mine'] 

    def get_mine(self, queryset, value): 
     try: 
      teacher = self.request.user.teacherprofile 
      return queryset.filter(supervisors=teacher) 
     except: 
      return queryset 

部分具有teacherprofiles的M2M领域,我基本上要确保结果只包含部分老师那里是监事。

此实现返回所有匹配的查询,但忽略了过滤条件,没有抛出任何类型的错误。

“最好”的结果,我已经得到了通过尝试来惹视图filter_queryset,加入.filter(监事=教师)的查询集,但返回我所有的部分与老师作为导师,加上与查询相匹配的所有课程,而不管主管的状态如何。

回答

0

因此,在这一天结束的时候,向谁可能关注,我最终使用SearchQuerySet返回结果的类,然后将结果转换为一个列表,而删除项目,而不老师作为导师。

这可能不是最有效的方式,我无法单独在Haystack中运行它(即使使用SQS和filter_and(name,supervisor)条件),但它仍然有效,并且性能仍然不足明智的。