You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:15:00