Наиболее эффективный способ пагинации объединенных запросов из нескольких моделей в 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]. Однако по мере увеличения номера страницы она становится все медленнее и медленнее.

Я уверен, что кто-то уже сталкивался с этой проблемой, как мне поступить?

Вернуться на верх