DRF и drf-haystack: Как использовать префетишированные кверисеты в сериализаторе drf-haystack

Есть ли способ использовать предварительно заданный кверисет при получении информации, связанной с объектом в SerializerMethodField HaystackSerializer'е?

В обычном представлении DRF можно передавать префетчированные запросы в сериализатор с помощью prefetch_related или annotate из собственного кверисета вместо кверисета Search. Что мне следует сделать в этом случае?

# search_indexes.py
class VideoIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr="title")
    published_at = indexes.DateTimeField(model_attr="published_at")

    def get_model(self):
        return Video

# views.py
class VideoSearchView(ListModelMixin, HaystackGenericAPIView):
    index_models = [Video]
    serializer_class = VideoSearchSerializer
    filter_backends = [HaystackFilter, HaystackOrderingFilter]
    ordering_fields = ["published_at"]

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

# serializers.py
class VideoSearchSerializer(HaystackSerializer):
    is_viewed = serializers.SerializerMethodField()
    is_favorited = serializers.SerializerMethodField()

    class Meta:
        index_classes = [VideoIndex]
        search_fields = ("text",)
        fields = (
            "title",
            "is_viewed",
            "is_favorited",
            "is_wl",
        )

    def get_is_viewed(self, obj):
        user = self.context["request"].user
        if user.is_authenticated:
            try:
                History.objects.get(user=user, video_id=obj.pk)
                return True
            except History.DoesNotExist:
                pass
        return False

    def get_is_favorited(self, obj):
        user = self.context["request"].user
        if user.is_authenticated:
            try:
                Favorite.objects.get(user=user, video_id=obj.pk)
                return True
            except Favorite.DoesNotExist:
                pass
        return False
Вернуться на верх