5

我正在使用 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)

但是我觉得我遗漏了一些东西,我无法从文档中弄清楚。

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

提前致谢。

4

2 回答 2

7

让我们分解问题:

  1. 您需要创建一个允许用户定义页面大小的分页方法:

    PageNumberPaginationDRF 文档中所述,您可以通过覆盖来定义参数名称page_size_query_param

    如果设置,这是一个字符串值,指示查询参数的名称,允许客户端基于每个请求设置页面大小。默认为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'
      
  2. 最后,您需要定义将在视图函数中使用的分页类。

    paginator通过将变量的值更改为PageNumberPaginatoror ,以下示例将适用于上述任何一种情况MyPaginator

    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)
    

现在您有了基于功能的视图,带有分页和查询参数来更改页面大小。

于 2017-08-07T10:40:14.560 回答
3

尝试PAGINATE_BY_PARAM设置。这个片段应该让你非常接近:

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

http://www.django-rest-framework.org/api-guide/pagination#pagination-in-the-generic-views

我的代码片段使用通用视图来消除很多重复,我建议也看看这些。http://www.django-rest-framework.org/api-guide/generic-views

于 2014-10-16T15:51:12.690 回答