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 DRF с oAuth2 с использованием DOT (django-oauth-toolkit)
  • Файл возврата django rest framework
  • Структура Django REST - несколько полей поиска?
  • Django Rest Framework ModelSerializer Установить атрибут для создания
  • Django Rest Framework (DRF) Как установить класс разбиения на страницы в зависимости от query_params?
  • django сортирует элементы запроса еженедельно ежемесячно ежедневно
  • Создайте UUID на клиенте и сохраните первичный ключ с помощью Django REST Framework и используйте POST
  • Соответствующий выбор класса проверки подлинности для API REST python, используемого веб-приложением
  • Как получить доступ к serializer.data в родительском классе ListSerializer в DRF?
  • Django Rest Framework ImageField
  • Как показать параметры параметров запроса в Django REST Framework - Swagger
  •  
    Interesting Posts for Van-Lav

    Стандарт кодирования порядка импорта

    Почему в Python и bash разрешения на файлы отличаются?

    Как игнорировать локальный питон при создании питона из источника

    Супер init и родительский .__ init__

    Есть ли у python re (regex) альтернатива escape-последовательностям Unicode?

    Итерация через пары ключевых значений в словаре python для создания списка объектов

    NLTK – нет модуля с именем corpus

    Как асинхронно применять функцию через Spark к подмножествам данных?

    Python – групповые дубликаты в списке списков по индексу

    Не удалось получить сообщения gmail из любой папки, кроме папки «Входящие» (проблема Python3)

    pandas dataframe создает новые столбцы и заполняет вычисленные значения из одного и того же df

    Python Проверка первого и последнего символа строки

    Каков наилучший способ взаимодействия с уже открытыми диалоговыми окнами собственной ОС, такими как (Сохранить AS) с помощью Python?

    Запись голоса в цикле while с использованием Tkinter

    Соедините два больших файла pandas.HDFStore HDF5

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