Django Rest Framework: включите разбиение на страницы на ViewSet (например, разбиение на страницы ModelViewSet)

У меня есть ViewSet, как этот, чтобы перечислять данные пользователей:

class Foo(viewsets.ViewSet): def list(self, request): queryset = User.objects.all() serializer = UserSerializer(queryset, many=True) return Response(serializer.data) 

Я хочу включить разбивку на страницы так, как разбиение на страницы по умолчанию для ModelViewSet:

 { "count": 55, "next": "http://myUrl/?page=2", "previous": null, "results": [{...},{...},...,{...}] } 

В официальном документе говорится:

Пагинация выполняется автоматически только в том случае, если вы используете общие представления или виды

… но мои результаты не разбиты на страницы. Как я могу его разбивать на страницы?

4 Solutions collect form web for “Django Rest Framework: включите разбиение на страницы на ViewSet (например, разбиение на страницы ModelViewSet)”

Пагинация выполняется автоматически только в том случае, если вы используете общие представления или виды

Первый roadblock – перевод документов на английский. То, что они намеревались передать, – это то, что вы желаете общий вид. Общие представления распространяются от общих ApiViews, которые имеют дополнительные методы класса для разбиения на страницы запросов и ответов.

Кроме того, вы предоставляете свой собственный метод list , но процесс разбивки по умолчанию на самом деле обрабатывается mixin :

 class ListModelMixin(object): """ List a queryset. """ def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) 

Простое решение, используйте код рамки:

 class Foo(mixins.ListModelMixin, viewsets.GenericViewSet): queryset = User.objects.all() serializer = UserSerializer 

Более сложное решение было бы, если вам нужен настраиваемый метод list , тогда вы должны написать его, как видите, но в стиле приведенного выше фрагмента кода mixin.

Для тех, кто использует DRF 3.1 или выше, они меняют способ разбивки по страницам по умолчанию. Подробнее см. http://www.django-rest-framework.org/topics/3.1-announcement/ .

Теперь, если вы хотите включить разбиение на страницы для ModelViewSet, вы можете сделать это глобально, установив в файле settings.py:

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

Или, если вы просто хотите его для одного ModelViewSet, вы можете вручную установить pagination_class только для этого вида.

 from rest_framework.pagination import PageNumberPagination class StandardResultsSetPagination(PageNumberPagination): page_size = 100 page_size_query_param = 'page_size' max_page_size = 1000 class FooViewSet(viewsets.ModelViewSet): pagination_class = StandardResultsSetPagination 

Это также позволяет вам настроить способ обработки постраничного изображения только для этого вида.

DRF 3.1 также представил новые типы схем разбивки по умолчанию, которые вы можете использовать, например, LimitOffset и Cursor.

Попробуйте предоставить переменную класса

 paginate_by = 10 #This will paginate by 10 results per page. 

Создайте пользовательский ViewSet который в ViewSet выполняет только операцию list .

 class ListModelViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): pass 

Теперь наследуем ваш класс Foo с помощью этого настраиваемого вида

 class Foo(ListModelViewSet): paginate_by = 10 def list(self, request): queryset = User.objects.all() serializer = UserSerializer(queryset, many=True) return Response(serializer.data) 

Это должно помочь вам получить разбивку на страницы.

Разбиение на страницы в DRF с использованием списков и списка

Здесь я обработал исключение. Если страница пуста, она будет показывать пустые записи

При настройке задайте размер страницы, этот размер страницы является глобальным и используется в представлении paginator_queryset

REST_FRAMEWORK = {'PAGE_SIZE': 10,}

Ввиду того, что mix_domain_framework импортирует mixins, viewets

 class SittingViewSet(viewsets.GenericViewSet, mixins.ListModelMixin): serializer_class = SittingSerializer queryset = Sitting.objects.all() serializer = serializer_class(queryset, many=True) def list(self, request, *args, **kwargs): queryset =self.filter_queryset(Sitting.objects.all().order_by('id')) page = request.GET.get('page') try: page = self.paginate_queryset(queryset) except Exception as e: page = [] data = page return Response({ "status": status.HTTP_404_NOT_FOUND, "message": 'No more record.', "data" : data }) if page is not None: serializer = self.get_serializer(page, many=True) data = serializer.data return self.get_paginated_response(data) # serializer = self.get_serializer(queryset, many=True) return Response({ "status": status.HTTP_200_OK, "message": 'Sitting records.', "data" : data }) 

**> Примечание. Если вы не используете Order_by, он будет показывать исключение, потому что этот список

дает неупорядоченный список. **

Interesting Posts

Numpy append: автоматически накладывать массив неправильного измерения

Как делать «и» и «или» работать, когда они объединены в одном заявлении?

Как принять keypress в командной строке python?

Как анализировать HTML-страницу, включая скрытые теги

Как использовать re для поиска последовательных, повторяющихся символов

Модели внутри тестов – выпуск Django 1.7

UnicodeEncodeError: кодек ascii не может кодировать символ u '\ xe7' в позиции 17710: порядковый номер не в диапазоне (128)

Python: TypeError: объект 'str' не является вызываемой системой рейтинга

Как распиливать функцию python со своими зависимостями?

Поиск xpaths на страницах с запущенным скриптом

python: сравнение двух строк

Прочитать текстовый файл в словаре, удаляя заголовок / завершающие символы новой строки

Проверьте, произошло ли изменение в re.sub

Venn3: Как переместить круги и метки?

Как добавить данные пакета рекурсивно в Python setup.py?

Python - лучший язык программирования в мире.