过滤当前用户的drf-haystack结果

时间:2016-11-16 17:42:10

标签: django-rest-framework django-haystack searchqueryset

我目前正在使用Django 1.10.3,带有elasticsearch后端的django-haystack搜索引擎和drf-haystack来证明这些观点。

搜索结果一般很好,但我完全无法按当前用户过滤结果。

索引是:

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

Section有一个带有teacherprofiles的M2M字段,我基本上想确保结果只包含教师在主管中的部分。

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

" best"结果我得到的是试图在视图中弄乱filter_queryset,在查询集中添加.filter(supervisors = teacher),但是以老师为主管的所有部分都返回了我,PLUS所有与之匹配的课程查询,无论主管状态如何。

1 个答案:

答案 0 :(得分:2)

所以在一天结束时,对于它可能关注的人,我最终使用SearchQuerySet返回类的结果,然后将结果转换为列表并删除项目,而不需要老师作为主管。

它可能不是最有效的方式,而且我无法单独在Haystack中工作(即使使用带有filter_and(名称,管理员)条件的SQS),但它仍然有效,并且仍然执行表现得足够好。