如何在django-rest-framework中为我的自定义分页类使用pagination_class

Pra*_*099 7 pagination django-rest-framework

我的分页课

class ArticleListPagination(PageNumberPagination):
    page_size = 2
    page_size_query_param = 'page_size'
Run Code Online (Sandbox Code Playgroud)

我的文章视图类

class Article(generics.GenericAPIView):

    queryset = Articles.objects.all()
    serializer_class = ArticlesSerializer
    pagination_class = ArticleListPagination

def get(self, request):
    queryset = self.get_queryset()
    serializer = ArticlesSerializer(queryset, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

我可以使用这个使用自定义分页类

def get(self, request):
    queryset = self.get_queryset()
    page = ArticleListPagination()
    new = page.paginate_queryset(queryset, request)
    serializer = ArticlesSerializer(new, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

这是正确的使用方式ArticleListPagination吗?如果我在我的班级中说过我的分页类ArticleListPagination,为什么它不会更改返回的queryset对象.

soo*_*oot 9

对于django_rest_framework 3.0.x(或以下):

您可以扩展rest_framework.mixins.ListModelMixin直接,或您imlement的get或list类似的方法.

当然generics.GenericAPIView也需要.

def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())
    page = self.paginate_queryset(queryset)
    if page is not None:
        # get_paginaion_serializer will read your DEFAULT_PAGINATION_SERIALIZER_CLASS 
        # or view.pagination_serializer_class 
        # we will talk the two variable later
        serializer = self.get_pagination_serializer(page)
    else:
        serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

如果您想将其配置为" 全局 ",则可以在settings.py中进行配置

REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_SERIALIZER_CLASS': 'YourCustomPaginationSerializer',
    # ...
}
Run Code Online (Sandbox Code Playgroud)

如果您只想设置特定视图:

该属性pagination_serializer_class代替pagination_class.

class MyView(generics.GenericAPIView):
    pagination_serializer_class = YourCustomPaginationSerializerClass
Run Code Online (Sandbox Code Playgroud)

对于django_rest_framework 3.1.x:

它有点不同,你可以先查看文档.3.1公告,分页文件

您可以rest_framework.mixins.ListModelMixin直接扩展,或者您使用类似的get方法.

当然generics.GenericAPIView也需要.

def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        return self.get_paginated_response(serializer.data)

    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud)

如果您想将其配置为" 全局 ",则可以在settings.py中进行配置

REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'

    # ...
}
Run Code Online (Sandbox Code Playgroud)

如果您只想设置特定视图:

class MyView(generics.GenericAPIView):
    pagination_class = YourCustomPaginationClass
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以在视图集中使用自定义分页,并在自定义视图上更改

pagination.py

class OneByOneItems(pagination.PageNumberPagination):
    page_size = 2

    def get_paginated_response(self, data):
        return Response(OrderedDict([
             ('lastPage', self.page.paginator.count),
             ('countItemsOnPage', self.page_size),
             ('current', self.page.number),
             ('next', self.get_next_link()),
             ('previous', self.get_previous_link()),
             ('results', data)
         ]))
Run Code Online (Sandbox Code Playgroud)

views.py

class LectionViewSet(viewsets.ReadOnlyModelViewSet):
    queryset = LectionCourse.objects.all().order_by('-created_at')
    serializer_class = LectionSerializer

    @list_route(methods=['get'], url_path='get-lections/(?P<pk>[^/]+)')
    def get_lection(self, request, pk):
        self.pagination_class = OneByOneItems
        queryset = self.filter_queryset(self.queryset.filter(course=pk))
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)   
Run Code Online (Sandbox Code Playgroud)

serializers.py

class CourseSerializer(serializers.ModelSerializer):
    author = UserCreatorSerializer(many=True)
    project = ProjectSerializer(many=True)

    class Meta:
        model = Course
        fields = ('id', 'theme', 'author', 'project')


class LectionSerializer(serializers.HyperlinkedModelSerializer):
    choose_course = CourseSerializer(source='course')

    class Meta:
        model = LectionCourse
        fields = ('id', 'title', 'video', 'preview_description', 'number', 'choose_course')
Run Code Online (Sandbox Code Playgroud)