【问题标题】:How to use LimitOffSetPagination instead of PageNumberPagination in Django Rest Framework?如何在 Django Rest Framework 中使用 LimitOffSetPagination 而不是 PageNumberPagination?
【发布时间】:2019-11-06 02:44:37
【问题描述】:

我已经使用 Django Rest Framework 在 Python 中编写了一个代码来从数据库(MySql)中获取数据并使用分页(LimitOffSetPagination)在浏览器中查看它。但是它不能正常工作。但是当我使用 PageNumberPagination 时工作得很好。所以我发布了我的新代码。我的代码的注释部分实际上是针对PageNumberPagination。所以只是忽略它。请告诉我所需的必要更改并帮助我。即将出现的错误是:

异常值:index() 缺少 1 个必需的位置参数: '请求'

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'),
]

我什至发布了我之前用于 PageNumberPagination 的 pagination.py 文件。如果需要进行任何必要的更改,请建议我,或者我应该将文件作为一个整体删除????

分页.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

【问题讨论】:

    标签: django python-3.x pagination django-rest-framework


    【解决方案1】:

    实际上我自己解决了这个问题......所以想发布解决方案......它可能会对某人有所帮助......所以我发布 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) 
    

    分页.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
     }
    

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2018-07-31
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多