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

DRF-Haystack SearchIndex returning from ALL index classes?

我在 django 中使用 haystack 和 elasticsearch 后端,并使用 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)

一切都很好,花花公子....直到我在其他配置文件上添加了两个索引和一个 view/serializer 来处理它们。所有都存在于相同的相应文件中: 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),但只有员工搜索端点正确 returns Staff和 TeacherProfile 结果,而学生搜索在一个单独的端点中,在一个单独的端点中,具有单独的视图、模型和索引,所有这些都明确说明,是 return StudentProfiles AND Teacher 和 StaffProfiles,我终究无法弄清楚为什么。

如果有人 运行 之前遇到过这个问题,我非常感谢帮助解决这个问题,更重要的是,理解这个问题。

提前致谢!

好吧,对于以后遇到同样问题的人,我需要做的就是解决这个问题。

我正在使用 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')

现在一切正常:)

我有同样的问题,但是当我使用 queryset.using('dynamic') 时,它会引发 django.core.exceptions.ImproperlyConfigured:密钥 'dynamic' 不是可用连接。

class DynamicSearchView(ListModelMixin, HaystackGenericAPIView):

    serializer_class = serializers.DynamicSearchSerializer
    filter_backends = [HaystackHighlightFilter]

    @swagger_auto_schema(
        manual_parameters=[text, type]
    )
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def filter_queryset(self, queryset):
        return super(DynamicSearchView, self).filter_queryset(queryset).using('dynamic')