Python Django Rest框架按指定的GET参数分页

Python Django Rest框架按指定的GET参数分页,python,django,pagination,django-rest-framework,Python,Django,Pagination,Django Rest Framework,我正在使用Django REST框架,需要根据请求提供的GET参数对列表进行分页 我知道我可以在设置中设置'PAGINATE_BY':10,但是我希望允许调用者在发出请求时指定他们要分页的号码 我目前拥有以下序列化程序: from api.models import Countries from rest_framework import serializers class CountrySerializer(serializers.Serializer): country_geona

我正在使用Django REST框架,需要根据请求提供的GET参数对列表进行分页

我知道我可以在设置中设置
'PAGINATE_BY':10
,但是我希望允许调用者在发出请求时指定他们要分页的号码

我目前拥有以下序列化程序:

from api.models import Countries
from rest_framework import serializers

class CountrySerializer(serializers.Serializer):
    country_geoname_id = serializers.CharField(required=True)
    country_code = serializers.CharField(source="iso", max_length=2L, required=True)
    country_name = serializers.CharField(max_length=64L, required=True)

    def transform_iso(self, obj, value):
        return "country_code"
我尝试了以下观点:

@api_view(['GET'])
def country_list(request):
    """
    List all countries
    """
    if request.method == 'GET':
        queryset = Countries.objects.all()
        serializer = CountrySerializer(queryset, many=True, data=request.DATA)
        paginate_by = request.GET.get('limit', 10)
        return Response(serializer.data)
然而,我觉得我遗漏了一些东西,我无法从文档中找出它

我应该在序列化程序中还是在视图中进行分页


提前感谢。

请尝试
按参数分页设置。这段代码应该可以让您非常接近:

class CountryListView(ListAPIView):
    model = Countries
    serializer_class = CountrySerializer
    paginate_by_param = 'limit'


我的代码片段使用通用视图来消除大量重复,我建议也看看这些视图

让我们来分析一下这个问题:

  • 您需要创建分页方法,允许用户定义页面大小:

    如DRF文档中所述,您可以通过覆盖
    页面大小查询参数来定义参数名

    如果已设置,则这是一个字符串值,指示允许客户端根据每个请求设置页面大小的查询参数的名称。默认值为
    None
    ,表示客户端可能无法控制请求的页面大小

    您可以通过以下方式之一实现这一点:

    • settings.py
      中添加以下内容:

      REST_FRAMEWORK = {
          'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
          'PAGE_SIZE': 10,
          'PAGINATE_BY_PARAM': 'page_size'
      }
      
    • 或者,您可以创建自定义分页类并覆盖其中的设置:

      from rest_framework.pagination import PageNumberPagination
      
      class MyPagination(PageNumberPagination):
          page_size = 10
          page_size_query_param = 'page_size'
      
  • 最后,您需要定义将在视图函数中使用的分页类

    以下示例仅通过将
    paginator
    变量的值更改为
    PageNumberPaginator
    MyPaginator
    即可用于上述任一情况:


  • 现在,您有了基于函数的分页视图和一个用于更改页面大小的查询参数。

    您阅读了吗?它清楚地解释了如何对数据进行分页。上面的链接已断开。这里是同一页:嘿@MarkWinterbottom我添加了一个迟来的(只有4年)答案。好好看看!是否有任何方法可以从
    MyPagination
    类本身检索
    page_size
    值,并在超出限制时返回错误?我问这个问题是因为我不想在每个
    视图
    视图集
    @上验证它,谢谢!是如果您正在创建
    MyPagination
    类的实例,则可以通过点表示法检索属性值:
    MyPagination\u实例。page\u size
    from rest_framework.pagination import PageNumberPagination
    
    @api_view(['GET'])
    def country_list(request):
    """
    List all countries
    """
    if request.method == 'GET':
        paginator = PageNumberPagination()
        queryset = Countries.objects.all()
        context = paginator.paginate_queryset(queryset, request)
        serializer = CountrySerializer(context, many=True)
        return paginator.get_paginated_response(serializer.data)