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, он будет показывать исключение, потому что этот список

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

  • Искать поля в нескольких моделях в Django
  • django rest framework вложенные modelserializer
  • django rest framework xml специальный символ
  • django-rest-framework HyperlinkedIdentityField с несколькими аргументами поиска
  • Django Rest Framework - учетные данные аутентификации не были предоставлены
  • загружать изображения в виде исходных данных в инфраструктуру отдыха django
  • Переопределение Django REST ViewSet с пользовательским методом и моделью
  • django-rest-framework + django-polymorphic ModelSerialization
  •  
    Interesting Posts for Van-Lav

    Все возможные способы чередования двух строк

    Где модуль слоев, определенный в PyCaffe

    Объединение 2 наборов данных csv с Python общим столбцом идентификатора – один csv имеет несколько записей для уникального идентификатора

    Какова истинная разница между леммитацией и вытеканием?

    Как я могу использовать супер () для Python для обновления родительского значения?

    Изменить символ новой строки .readline () ищет

    Функция трансформирования / распаковки (инверсия zip)?

    Список всех аудиоустройств с pyaudio Python (привязка к порталу)

    Миграция из дистрибутива в setuptools

    как вы радиально «выметаете» 1-мерный массив для построения трехмерной фигуры на питоне? (для представления волновой функции)

    Указание места установки зависимостей 'tests_require' пакета distribute / setuptools

    Прогулка по всем узлам XML в элементарной структуре

    Разделить большие файлы с помощью python

    Python: печать в строках

    Установить прозрачность символа легенды с помощью matplotlib?

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