栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django Rest Framework 3.1打破了分页.PaginationSerializer

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django Rest Framework 3.1打破了分页.PaginationSerializer

我不确定这是否是完全正确的方法,但是它可以满足我的需求。它使用Django Paginator和自定义序列化程序。

这是我的View类,它检索对象以进行序列化

class CourseListView(AuthView):    def get(self, request, format=None):        """        Returns a JSON response with a listing of course objects        """        courses = Course.objects.order_by('name').all()        serializer = PaginatedCourseSerializer(courses, request, 25)        return Response(serializer.data)

这是使用我的Course序列化程序的被黑客入侵的序列化程序。

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPageclass PaginatedCourseSerializer():    def __init__(self, courses, request, num):        paginator = Paginator(courses, num)        page = request.QUERY_PARAMS.get('page')        try: courses = paginator.page(page)        except PageNotAnInteger: courses = paginator.page(1)        except EmptyPage: courses = paginator.page(paginator.num_pages)        count = paginator.count        previous = None if not courses.has_previous() else courses.previous_page_number()        next = None if not courses.has_next() else courses.next_page_number()        serializer = CourseSerializer(courses, many=True)        self.data = {'count':count,'previous':previous,      'next':next,'courses':serializer.data}

这给了我一个类似于旧分页器所给出的行为的结果。

{    "previous": 1,    "next": 3,    "courses": [...],    "count": 384}

我希望这有帮助。我仍然认为必须使用新的API来实现此目的,但这还没有被很好地记录。如果我发现更多问题,我将编辑我的帖子。

编辑

我想我发现了一种更好,更优雅的方法,可以通过创建自己的自定义分页器来获得与以前使用旧的Paginated Serializer类类似的行为。

这是一个自定义分页器类。我重载了响应和下一页方法以获得想要的结果(即,

?page=2
而不是完整的URL)。

from rest_framework.response import Responsefrom rest_framework.utils.urls import replace_query_paramclass CustomCoursePaginator(pagination.PageNumberPagination):    def get_paginated_response(self, data):        return Response({'count': self.page.paginator.count,   'next': self.get_next_link(),   'previous': self.get_previous_link(),   'courses': data})    def get_next_link(self):        if not self.page.has_next(): return None        page_number = self.page.next_page_number()        return replace_query_param('', self.page_query_param, page_number)    def get_previous_link(self):        if not self.page.has_previous(): return None        page_number = self.page.previous_page_number()        return replace_query_param('', self.page_query_param, page_number)

然后,我的课程视图与您的实现非常相似,只是这次使用“自定义”分页器。

class CourseListView(AuthView):    def get(self, request, format=None):        """        Returns a JSON response with a listing of course objects        """        courses = Course.objects.order_by('name').all()        paginator = CustomCoursePaginator()        result_page = paginator.paginate_queryset(courses, request)        serializer = CourseSerializer(result_page, many=True)        return paginator.get_paginated_response(serializer.data)

现在,我得到了想要的结果。

{    "count": 384,    "next": "?page=3",    "previous": "?page=1",    "courses": []}

对于Browsable API,我仍然不确定(我不使用drf的此功能)。我认为您也可以为此创建自己的自定义类。我希望这有帮助!



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/623739.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号