Django REST Framework视图集不服从pagination_class

时间:2017-03-15 02:27:21

标签: django django-rest-framework

我已在我的应用中为某个pagination_class成功实施了自定义ModelViewSet,但我在为基本ViewSet实施单独的自定义pagination_class时遇到问题。

这是工作的pagination_class和相关的ModelViewSet:

class Model1Pagination(PageNumberPagination):
  page_size = 10
  page_size_query_param = 'page_size'
  max_page_size = 100

class Model1ViewSet(viewsets.ModelViewSet):
"""
API endpoint that returns the instances of Model1
"""

  queryset = Model1.objects.all()
  serializer_class = Model1Serializer
  pagination_class = Model1Pagination

  @list_route()
  def extra(self, request)
    ....
    return <something>

这是pagination_class和ViewSet,它不起作用:

class Model2Pagination(PageNumberPagination):
  page_size = 1
  page_query_param = 'page_size'
  max_page_size = 1

class Model2GenericViewSet(viewsets.ViewSet):
"""
API endpoint to return the instances of Model2
"""

  def get_queryset():
    return Model2.objects.all()
  pagination_class = Model2Pagination

  def list(self, request):
    queryset = self.get_queryset()
    serializer = Model2Serializer(queryset, many=True, context={'request': request})
    return Response(serializer.data)

我想我可以改变Model2GenericViewSet作为ModelViewSet,但我希望避免重构,DRF文档提到:

  

只有在您使用通用视图或视图集

时才会自动执行分页

所以我认为使用ViewSet会好的。我最初没有在ViewSet上指定get_queryset(),我最初的想法是我需要这样做,但是添加它并不会影响行为。

使用Model1Pagination进行一些测试后,我没有看到分页适用于extra()视图中的Model1方法的结果 - 它不是方法我需要分页,所以我只是发现了这个。

上面的doc引用是否意味着分页只是适用于内置的viewset方法?

2 个答案:

答案 0 :(得分:2)

ViewSet类继承自APIView。关系是: 查看(在Django中) - &gt; APIView - &gt; ViewSet

ModelViewSetclass继承自GenericViewSet。关系是: 查看(在Django中) - &gt; APIView - &gt; GenericAPIView - &gt; GenericViewSet - &gt; ModelViewSet

pagination_class是在GenericAPIView中添加的,所以你不能在继承自APIView的类中使用它。你可以尝试viewsets.GenericViewSet。

返回分页响应,例如:

def list(self, request, *args, **kwargs):
    students = Student.objects.all()
    page = self.paginate_queryset(students)
    if page is not None:
        serializer = StudentSerializer(page, many=True)
        return self.get_paginated_response(serializer.data)
    serializer = StudentSerializer(students, many=True)
    return Response(serializer.data)

答案 1 :(得分:0)

你必须,

...
return self.get_paginated_response(serializer.data)

手动,如果你覆盖list()。