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

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

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

      # 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

0 ответов

Другие вопросы по тегам