Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pagination 如何在django rest框架中为自定义分页类使用分页_类_Pagination_Django Rest Framework - Fatal编程技术网

Pagination 如何在django rest框架中为自定义分页类使用分页_类

Pagination 如何在django rest框架中为自定义分页类使用分页_类,pagination,django-rest-framework,Pagination,Django Rest Framework,我的分页类 class ArticleListPagination(PageNumberPagination): page_size = 2 page_size_query_param = 'page_size' class Article(generics.GenericAPIView): queryset = Articles.objects.all() serializer_class = ArticlesSerializer paginatio

我的分页类

class ArticleListPagination(PageNumberPagination):
    page_size = 2
    page_size_query_param = 'page_size'
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)
我的文章视图类

class ArticleListPagination(PageNumberPagination):
    page_size = 2
    page_size_query_param = 'page_size'
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)
我可以使用这个自定义分页类

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)
使用
文章列表分页是否正确?如果我在我的类中声明我的分页类是
ArticleListPagination
,为什么它不更改return queryset对象。

对于django_rest_framework3.0.x(或以下): 您可以直接扩展
rest\u framework.mixins.ListModelMixin
,也可以添加类似的
get
list
方法

当然
泛型。还需要泛型piview

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)
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)
如果您想将其配置为“global”,您可以在settings.py中进行配置

REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_SERIALIZER_CLASS': 'YourCustomPaginationSerializer',
    # ...
}
REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'

    # ...
}
如果您只想设置为特定视图:

class MyView(generics.GenericAPIView):
    pagination_class = YourCustomPaginationClass
该属性是
pagination\u serializer\u class
,而不是
pagination\u class

class MyView(generics.GenericAPIView):
    pagination_serializer_class = YourCustomPaginationSerializerClass
对于django_rest_框架3.1.x: 稍有不同,您可以先查看文档

您可以直接扩展
rest\u framework.mixins.ListModelMixin
,也可以添加类似的
get
方法

当然
泛型。还需要泛型piview

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)
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)
如果您想将其配置为“global”,您可以在settings.py中进行配置

REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_SERIALIZER_CLASS': 'YourCustomPaginationSerializer',
    # ...
}
REST_FRAMEWORK = {
    # ...
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination'

    # ...
}
如果您只想设置为特定视图:

class MyView(generics.GenericAPIView):
    pagination_class = YourCustomPaginationClass

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

分页.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)
         ]))
from rest_framework import status
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.response import Response

class CustomPagination(LimitOffsetPagination):
def get_paginated_response(self, data):
    return Response({
        "status": True,
        "code": status.HTTP_200_OK,
        'next': self.get_next_link(),
        'previous': self.get_previous_link(),
        'count': self.count,
        'results': data
    })
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)   

我更喜欢使用自定义分页,因为它允许您根据自己的要求修改响应。这种方法不需要太多的努力

下面是我的代码。。。希望这会有帮助

自定义分页.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)
         ]))
from rest_framework import status
from rest_framework.pagination import LimitOffsetPagination
from rest_framework.response import Response

class CustomPagination(LimitOffsetPagination):
def get_paginated_response(self, data):
    return Response({
        "status": True,
        "code": status.HTTP_200_OK,
        'next': self.get_next_link(),
        'previous': self.get_previous_link(),
        'count': self.count,
        'results': data
    })
在您看来,您只需调用两个函数,即paginate_queryset和您在分页类get_paginate_response中创建的函数。“pagination_queryset”将queryset作为参数,然后将结果传递给序列化程序,最后调用“get_paginated_response”,它将序列化数据作为参数并在结果返回响应中返回

page = self.paginate_queryset(query_set)
serializer_class = <Your Serializer>(page, many=True,)
return self.get_paginated_response(serializer_search_user.data)
page=self.paginate\u queryset(查询集)
序列化程序_class=(第页,多个=True,)
返回self.get\u分页的\u响应(序列化程序\u搜索\u用户.data)
最后在“settings.py”中声明自定义序列化类

REST\u框架={
“默认分页类”:“…自定义分页。自定义分页”,
“页面大小”:5
}

这是一个向我展示如何从应用程序正确导入分页类的答案。谢谢