如何为Django Rest Framework的该函数视图实现分页功能
Django Rest Framework 函数视图GET请求分页实现方案
你当前使用的是DRF函数式视图,需要手动调用DRF分页工具类实现分页,操作步骤如下:
步骤1:自定义分页类
你可以根据业务需求调整分页参数,示例代码如下:
from rest_framework.pagination import PageNumberPagination # 自定义分页规则,也可直接使用DRF自带的PageNumberPagination class CustomPagePagination(PageNumberPagination): # 每页默认返回数据量 page_size = 15 # 支持前端通过page_size参数自定义每页数量 page_size_query_param = 'page_size' # 每页最大返回数量限制 max_page_size = 100 # 页码请求参数名 page_query_param = 'page'
步骤2:修改原视图逻辑
我们默认你需要分页的是核心业务数据集snippets(对应返回字段data['data']),其他公共配置类数据无需分页,修改后的完整视图代码如下:
@api_view(["GET"]) def school_titul_list(request): if request.method == 'GET': try: data = {} user = request.user schools = user_utils.user_schools(user) data['warning'] = False if user.is_superuser: snippets = models.SchoolTitulHead.objects.filter(school__nash=True) if 'school' in request.query_params: snippets = snippets.filter(school_id__in=request.query_params['school'].split(',')) else: snippets = snippets.filter(school_id__in=[]) else: snippets = models.SchoolTitulHead.objects.filter(school__in=schools.values_list('school', flat=True), deleted=False) snippets = snippets.order_by('deleted', '-year', 'klass', 'liter_id').select_related('school', 'kurator', 'kurator__portfolio') # 新增分页逻辑开始 paginator = CustomPagePagination() # 对核心数据集做分页处理 paginated_snippets = paginator.paginate_queryset(snippets, request) # 新增分页逻辑结束 work_places = p_models.PortfolioWorkTimeLine.objects.filter(current=True, portfolio__deleted=False, deleted=False, checked=True, ) work_places = work_places.filter(school__in=schools.values_list('school', flat=True)) work_places = work_places.values_list('portfolio', flat=True) portfolios = p_models.Portfolio.objects.filter(pk__in=work_places).distinct().order_by('name_ru') data['users'] = serializers.PortfolioSerializers(portfolios, many=True).data data['liters'] = serializers.LiterSerializers(Liter.objects.filter(deleted=False), many=True).data # 替换原有序列化逻辑,使用分页后的数据 data['data'] = serializers.GetHeadSchoolTitulSerializer(paginated_snippets, many=True).data # 新增分页元信息返回 data['total_count'] = paginator.page.paginator.count data['total_pages'] = paginator.page.paginator.num_pages data['current_page'] = paginator.page.number data['page_size'] = paginator.page.paginator.per_page data['languages'] = serializers.LanguageSerializer(p_models.Language.objects.filter(deleted=False), many=True).data data['studyDirections'] = serializers.StudyDirectionsSerializer( StudyDirections.objects.filter(deleted=False), many=True).data data['klasss'] = serializers.KlassSerializersID(p_models.Klass.objects.filter(deleted=False, klass_type=2), many=True).data data['datas'] = serializers.DateObjectsSerializer( p_models.DateObjects.objects.filter(deleted=False, id=9).order_by('id'), many=True).data return JsonResponse(data) except AccessToEdit.DoesNotExist: return JsonResponse({'errors': 'Нет доступа', 'warning': 0}, status=400)
调用方式
前端请求接口时携带参数即可获取对应分页数据,示例请求:GET /your/api/path?page=2&page_size=20
上述请求代表获取第2页数据,每页返回20条。
如果你需要对其他返回的数据集做分页,参考上述分页逻辑处理对应查询集即可。
内容的提问来源于stack exchange,提问作者Asylkhan Mustafa
相关产品推荐
相关产品推荐

