Как добавить пагинацию в django ReadOnlyModelViewSet или ListAPIView?
У меня есть проект Django Restframework. Вот мой вид:
class JobView(viewsets.ReadOnlyModelViewSet):
queryset = Job.objects.all()
serializer_class = JobSerializer
filter_backends = [filters.OrderingFilter, DjangoFilterBackend, filters.SearchFilter]
search_fields = [...]
ordering_fields = ['jobId']
ordering = ['-jobId']
filterset_fields = ['jobId', 'status']
pagination_class = StandardResultsSetPagination
и мой класс пагинации:
class StandardResultsSetPagination(LimitOffsetPagination):
page_size = 1
Представление зарегистрировано в маршрутизаторе:
router.register(r'jobs', JobView)
Проблема в том, что он вообще не делает пагинацию. Он просто игнорирует атрибут pagination_class.
Я также пробовал:
class JobView(generics.ListAPIView)
И зарегистрировал вид без маршрутизатора. Но проблема та же. Он не пагинация и просто возвращает json список со всеми заданиями.
Как добиться пагинации в этом представлении, не определяя ее глобально для проекта в settings.py?
Наследует ли ваш StandardResultsSetPagination
правильный стиль пагинации? LimitOffsetPagination по умолчанию не ограничивает вывод (помимо настройки PAGE_SIZE
) и требует параметров запроса для установки ограничения. Он также не имеет атрибута класса page_size
, в отличие от PageNumberPagination.
Попробуйте заменить ваш класс пагинации на следующий код
from rest_framework.pagination import PageNumberPagination
class CustomPagination(PageNumberPagination):
page_size = 5
page_size_query_param = 'page_size'
Если вы не задали default_limit и вызываете /jobs, он отобразит результат как обычно. В случае LimitOffsetPagination вам нужно либо указать limit и offset в запросе, либо указать default_limit, чтобы увидеть разницу.