DRF-Haystack SearchIndex从所有索引类返回?

时间:2016-09-28 21:54:56

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

我在django中使用带有elasticsearch后端的haystack,并使用drf-haystack来实现结果的序列化器。

我首先创建了一个StudentIndex,它通过StudentProfiles编制索引,用于搜索 search_indexes.py

中的学生
class StudentIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(
        document=True,
        use_template=True,
        template_name="search/indexes/user_search_text.txt")

    //other indexes or indices or whatever

    def get_model(self):
        return StudentProfile

    def index_queryset(self, using=None):
        return StudentProfile.objects.filter(user__is_active=True)

传递给 views.py

中的序列化程序和视图集
class StudentSerializer(HaystackSerializer):

    class Meta:
        index_classes = [StudentIndex]


class StudentSearchView(ListModelMixin, HaystackGenericAPIView):
    index_models = [StudentProfile]
    serializer_class = StudentSerializer
    pagination_class = None

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

并且一切都很好和花花公子....直到我在其他配置文件和单个视图/序列化器上添加了两个索引来处理它们。全部存在于相同的文件中: 的 search_indexes.py

class TeacherIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(
        document=True,
        use_template=True,
        template_name="search/indexes/user_search_text.txt")

    //other indexes or indices or whatever

    def get_model(self):
        return TeacherProfile

    def index_queryset(self, using=None):
        return TeacherProfile.objects.filter(user__is_active=True)

class StaffIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(
        document=True,
        use_template=True,
        template_name="search/indexes/user_search_text.txt")

    //other indexes or indices or whatever

    def get_model(self):
        return StaffProfile

    def index_queryset(self, using=None):
        return StaffProfile.objects.filter(user__is_active=True)

并添加到 views.py

class StaffSerializer(HaystackSerializer):

    class Meta:
        index_classes = [StaffIndex, TeacherIndex]


class StaffSearchView(ListModelMixin, HaystackGenericAPIView):
    index_models = [StaffProfile, TeacherProfile]
    serializer_class = StaffSerializer
    pagination_class = None

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

现在....每个视图都进入自己的url端点(分别是/ student-search和/ staff-search),但只有人员搜索端点正确返回Staff和TeacherProfile结果,而学生搜索,一个单独的端点,单独的视图和模型和索引都明确说明,是返回StudentProfiles和教师和StaffProfiles,我不能为我的生活找出原因。

如果有人之前碰到过这种情况,我真的很感谢帮助解决,更重要的是,理解这个问题。

提前致谢!

2 个答案:

答案 0 :(得分:0)

那么,对于具有相同问题的未来人来说,我只需要做的就是解决它。

我正在使用DRF-Haystack genericviewapi,在视图中,我只是将filter_queryset定义为使用正确的haystack连接(忽略其他索引)。例如:

class StudentSearchView(ListModelMixin, HaystackGenericAPIView):
    index_models = [StudentProfile]
    serializer_class = StudentSerializer
    pagination_class = None

    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('student')

现在一切正常:)

答案 1 :(得分:0)

我遇到了同样的问题,但是当我使用// call to catName before declaration catName("Chloe"); function catName(name) { console.log(`My cat's name is ${name}!`); }时,它会引发queryset.using('dynamic'):键“ dynamic”不是可用的连接。

django.core.exceptions.ImproperlyConfigured
相关问题