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