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