Как оптимизировать запросы в сериализаторах Django Rest Framework (DRF)?

info: У меня есть компонентная модель с полем search_tags, которое является полем многие ко многим с моделью Search и у меня есть сериализатор для компонентной модели, который является ComponentSerializer, и я использую get_videos для получения видео для каждого компонента и я хочу получить видео для каждого поискового тега в поле search_tags и сохранить их в filtered_data_list и вернуть их в качестве ответа

Время отклика очень медленное, и я хочу оптимизировать его, но не знаю, как это сделать (я новичок в django и rest framework). Вот методы, которые я изучил, но я не знаю, как использовать их в моем случае, и я не знаю, являются ли они лучшим способом сделать это или нет:

  • prefetch_related и select_related, но это не сработало.
  • Использовать сырой sql запрос, но я не знаю, как это сделать.
  • Использовать кэш django, но я не знаю, как это сделать.
  • Использовать кэш django и сырой sql запрос, но я не знаю, как это сделать.

enter image description here

class ComponentSerializer(serializers.ModelSerializer):
    ''' component serializer '''

    videos = serializers.SerializerMethodField()

    class Meta:
        model = Component
        fields = ['title', 'slug', 'videos']

    def get_videos(self, obj):
        filtered_data_list = []

        for search in obj.search_tags.select_related('component').filter(is_active=True):
            ''' Thumbnails if thumbnail is not None '''
            thumbnail = search.thumbnail.url if search.thumbnail else None
            ''' Query for videos '''
            videos = YTVideo.objects.select_related('channel').filter(
                Q(channel=search.channel) | Q(channel__category__name=search.category),
                reduce(operator.or_, (Q(title__icontains=tag) for tag in search.content.split(',')))
            ).order_by(search.ordering_field)[:search.limit]

            ''' Append data to filtered_data_list excluding multile arrays '''
            for video in videos.select_related('channel'):
                if thumbnail:
                    video.thumbnail = thumbnail
                filtered_data_list.append(video)

        return YTVideoSerializer(filtered_data_list, many=True).data
Вернуться на верх