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