Как использовать LimitOffSetPagination вместо PageNumberPagination в Django Rest Framework? - PullRequest
1 голос
/ 24 июня 2019

Я написал код на Python с использованием Django Rest Framework для извлечения данных из базы данных (MySql) и просмотра их в браузере с помощью Pagination (LimitOffSetPagination). Но это не работает нормально. Но когда я использовал PageNumberPagination, он работал отлично. ... так что я публикую свой новый код. Комментированные части моего кода на самом деле для PageNumberPagination. Так что просто игнорируйте это. Пожалуйста, сообщите мне необходимые изменения и помогите мне. Приходит ошибка - "" "" Значение исключения:
index () отсутствует 1 обязательный позиционный аргумент: 'request' "" "" ....

view.py

from rest_framework.pagination import PageNumberPagination
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from rest_framework.pagination import LimitOffsetPagination


@api_view(['GET','POST'])

def index(self, request):

  if request.method=='GET':

    all_dataobj=fetchdata.objects.all()

    page = self.paginate_queryset(all_dataobj)

     if page is not None:

      pserializer = self.get_fetchdataSerializers(page, many=True)

      return self.get_paginated_response(pserializer.data)

    pserializer = self.get_fetchdataSerializers(all_dataobj, many=True)

    return Response(pserializer.data)

    # paginator = StandardResultsSetPagination()
    # result_page = paginator.paginate_queryset(all_dataobj, request)
    # pserializer=fetchdataSerializers(result_page,many=True)
    # return paginator.get_paginated_response(pserializer.data) 


 elif request.method=='POST':

  serializer=fetchdataSerializers(data=request.data)

  if serializer.is_valid():

    serializer.save()

  return Response(serializer.data,status=status.HTTP_201_CREATED)
  return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST) 

settings.py

REST_FRAMEWORK = {

      'DEFAULT_PAGINATION_CLASS': 
      'rest_framework.pagination.LimitOffsetPagination',
      'PAGE_SIZE': 10
      }

urls.py

urlpatterns = [
path('', m.index, name='index'),
]

Я даже публикую файл pagination.py, который я использовал ранее для PageNumberPagination. Пожалуйста, предложите мне, если необходимо внести какие-либо необходимые изменения, или я должен удалить файл целиком ????

pagination.py

from rest_framework import pagination

class StandardResultsSetPagination(pagination.PageNumberPagination):
page_size = 10
page_query_param = 'page'
page_size_query_param = 'per_page'
max_page_size = 1000

1 Ответ

0 голосов
/ 25 июня 2019

На самом деле я решил эту проблему сам ... поэтому мне хотелось опубликовать решение ... Это может кому-то помочь ... поэтому я публикую файлы view.py, pagination.py и settings.py .. .

view.py

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .pagination import CustomPagination


@api_view(['GET','POST'])

def index(request):

  if request.method=='GET':

    all_dataobj=fetchdata.objects.all()

    paginator = CustomPagination()
    result_page = paginator.paginate_queryset(all_dataobj, request)

    pserializer=fetchdataSerializers(result_page,many=True)

    return paginator.get_paginated_response(pserializer.data) 


  elif request.method=='POST':

    serializer=fetchdataSerializers(data=request.data)

    if serializer.is_valid():

      serializer.save()

    return Response(serializer.data,status=status.HTTP_201_CREATED)
    return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST) 

pagination.py

    class CustomPagination(pagination.LimitOffsetPagination):

      default_limit = 1000
      max_limit = 1000000
      min_limit = 1
      min_offset = 0
      max_offset = 1000000

       def paginate_queryset(self, queryset, request, view=None):

         limit = request.query_params.get('limit')
         offset = request.query_params.get('offset')

         if limit:

            limit = int(limit)

            if limit > self.max_limit:

              raise serializers.ValidationError({"limit" : ["Limit should be less 
              than or equal to {0}".format(self.max_limit)]})

            elif limit < self.min_limit:

              raise serializers.ValidationError({"limit" : ["Limit should be greater 
              than or equal to {0}".format(self.min_limit)]})

         if offset:

           offset = int(offset)

           if offset > self.max_offset:

             raise serializers.ValidationError({"offset" : ["Offset should be less 
             than or equal to {0}".format(self.max_offset)]})

          elif offset < self.min_offset:

            raise serializers.ValidationError({"offset" : ["Offset should be greater 
            than or equal to {0}".format(self.min_offset)]})

         return super(self.__class__, self).paginate_queryset(queryset, request, 
         view)

settings.py

REST_FRAMEWORK = {
# 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...