- Разбиение на страницы по умолчанию: отправная точка
DRF поставляется со встроенными классами разбивки на страницы, которые сразу же предоставляют базовые функции разбиения на страницы. К этим классам относятсяPageNumberPagination
,LimitOffsetPagination
иCursorPagination
.
a) PageNumberPagination
: этот стиль нумерации страниц делит данные на страницы и предоставляет ссылки для навигации по ним. Размер страницы можно установить с помощью атрибута page_size
, а текущую страницу можно указать с помощью параметра запроса page
.
Пример кода:
from rest_framework.pagination import PageNumberPagination
class MyPaginationClass(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 100
# In your view or viewset:
class MyViewSet(viewsets.ModelViewSet):
pagination_class = MyPaginationClass
# ...
b) LimitOffsetPagination
: этот подход позволяет пользователям указывать предел (количество элементов на странице) и смещение (начальную точку для данных). Параметры запроса limit
и offset
используются для управления нумерацией страниц.
Пример кода:
from rest_framework.pagination import LimitOffsetPagination
class MyPaginationClass(LimitOffsetPagination):
default_limit = 10
max_limit = 100
# In your view or viewset:
class MyViewSet(viewsets.ModelViewSet):
pagination_class = MyPaginationClass
# ...
c) CursorPagination
: при нумерации страниц на основе курсора используется курсор (обычно закодированная строка) для определения положения в наборе данных. Этот метод полезен при работе с отсортированными или отфильтрованными данными, поскольку он обеспечивает стабильные результаты, несмотря на изменения в наборе данных.
Пример кода:
from rest_framework.pagination import CursorPagination
class MyPaginationClass(CursorPagination):
page_size = 10
ordering = 'created_at'
# In your view or viewset:
class MyViewSet(viewsets.ModelViewSet):
pagination_class = MyPaginationClass
# ...
- Пользовательская нумерация страниц: адаптация нумерации страниц к вашим потребностям
Если классы нумерации страниц по умолчанию не соответствуют вашим требованиям, DRF позволяет вам создать свой собственный класс нумерации страниц. Это дает вам полный контроль над логикой нумерации страниц.
Пример кода:
from rest_framework.pagination import PageNumberPagination
class MyCustomPagination(PageNumberPagination):
page_size = 20
# In your view or viewset:
class MyViewSet(viewsets.ModelViewSet):
pagination_class = MyCustomPagination
# ...
- Объединение методов разбивки на страницы: лучшее из обоих миров
DRF также позволяет комбинировать различные методы разбивки на страницы для достижения более сложного поведения разбивки на страницы. Например, вы можете использоватьPageNumberPagination
сLimitOffsetPagination
, чтобы включить навигацию на основе страниц, при этом позволяя пользователям указывать ограничение и смещение.
Пример кода:
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
class MyCustomPagination(PageNumberPagination, LimitOffsetPagination):
page_size = 10
limit_query_param = 'limit'
offset_query_param = 'offset'
# In your view or viewset:
class MyViewSet(viewsets.ModelViewSet):
pagination_class = MyCustomPagination
# ...
К этому моменту вы должны иметь четкое представление о различных методах нумерации страниц, доступных в DRF. Независимо от того, придерживаетесь ли вы параметров по умолчанию или создаете свой собственный класс нумерации страниц, нумерация страниц — это мощный инструмент для управления большими наборами данных в ваших API. Так что вперед, реализуйте нумерацию страниц в своих проектах DRF и обеспечьте пользователям удобство просмотра!