我已在我的应用中为某个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方法?
答案 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()。