PRO

Как реализовать пагинацию в DRF?

DRF поддерживает пагинацию на уровне настроек или конкретного view. Для стандартного API часто выбирают PageNumberPagination, задают класс пагинации и размер страницы, после чего list-endpoint возвращает ссылки на страницы, общее число объектов и результаты.
Подробный ответ

Зачем нужна пагинация

Пагинация ограничивает число объектов в одном API-ответе. Она снижает нагрузку на базу и сеть, делает ответы предсказуемыми и позволяет клиенту загружать большой список частями.

Глобальная настройка

Пагинацию можно включить для всего DRF в settings.py.

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 20,
}

Собственный класс пагинации

from rest_framework.pagination import PageNumberPagination


class ArticlePagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100

Затем класс указывают в ViewSet через pagination_class.

class ArticleViewSet(ModelViewSet):
    queryset = Article.objects.all()
    serializer_class = ArticleSerializer
    pagination_class = ArticlePagination

Виды пагинации

DRF предоставляет PageNumberPagination, где используется номер страницы, LimitOffsetPagination, где передают limit и offset, и CursorPagination, которая использует курсор и хорошо подходит для больших, стабильно отсортированных списков.

Как ответить на собеседовании

В DRF я обычно задаю PageNumberPagination и PAGE_SIZE глобально или для конкретного ViewSet. Если API работает с очень большими списками и стабильной сортировкой, рассматриваю CursorPagination.

Оцени свой прогресс

Честно оцени своё понимание этого вопроса, чтобы мы могли построить твой учебный трек максимально эффективно.
Читать в блоге