Как оптимизировать запросы в сериализаторах 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 запрос, но я не знаю, как это сделать.
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