Django REST Framework: Как передать сериализатору предварительно установленный кверисет, когда представление должно использовать предоставленный библиотекой кверисет

Я хотел бы использовать drf-haystack для использования набора запросов с предварительной выборкой сериализатором, как показано ниже. Мне нужно использовать специфичный для haystack кверисет (annotate и prefetch_related недоступны) для этого представления, и Я не могу передать предварительно выбранный набор в SerializerMethodField.

Я потратил довольно много времени на этот вопрос. Есть ли лучший способ сделать это?

# views.py
class PostSearchView(ListModelMixin, HaystackGenericAPIView):
    index_models = [Post]
    serializer_class = PostSearchSerializer

    def filter_queryset(self, *args, **kwargs):
        #This queryset is haystack's own queryset, so it cannot be annotate or prefetch_related.
        queryset = super(PostSearchView, self).filter_queryset(self.get_queryset())
        return queryset.filter(published_at__lte=timezone.now())

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


# serializers.py
class PostSearchSerializer(BaseHaystackSerializer):
    is_views = serializers.SerializerMethodField()

    class Meta:
        index_classes = [PostIndex]
        search_fields = ("text",)
        fields = ("is_views",)

    def get_is_views(self, obj):
        try:
            History.objects.get(post_id=obj.pk)
            return True
        except History.DoesNotExist:
            return False

        return obj.is_views # I wanted to do it this way.
Вернуться на верх