Наиболее эффективный способ пагинации объединенных запросов из нескольких моделей в Django Rest Framework
Я создаю сайт социальной сети, используя DRF в качестве бэк-энда. Недавно я заметил, что лента "Главная" становится слишком медленной для комфорта. Затем я понял, что, хотя я и использую пагинатор, я все еще сериализую все объекты "Feed Item" перед их пагинацией. Взгляните на код ниже:
# serialize
reposts = RepostSerializer(reposts_query, many=True).data
posts = SmallPostSerializer(feed_posts_query, many=True).data
comments = FeedCommentSerializer(feed_comments_query, many=True).data
#combine
combined_posts_and_comments = list(chain(reposts, posts, comments))
# sort combined list by date
feed_items = sorted(
combined_posts_and_comments, key=lambda k: k["date"], reverse=True
)
# paginate combined list
paginator = Paginator(feed_items, self.page_size)
Как мне получить только необходимые элементы для выбранной страницы перед сериализацией элементов ленты?
Я не могу просто нарезать запросы как [(page_size * page_num) - page_size:page_size * page_num]
, потому что после объединения и пагинации, это создаст странные и непоследовательные результаты при переходе на следующую страницу.
Я также пробовал нарезать так: [:page_size * page_num]
. Однако по мере увеличения номера страницы она становится все медленнее и медленнее.
Я уверен, что кто-то уже сталкивался с этой проблемой, как мне поступить?