天天看点

Django开源框架2023-6-10(分页器)

作者:不易9093

一、Django默认分页器

官方网站:官方网站https://docs.djangoproject.com/zh-hans/4.2/ref/paginator/

Django Paginator 页面提供了有关分页器对象的详细信息和示例。它解释了什么是分页器,如何使用它们以及如何在 Django 应用程序中使用它们。

理解和认识:

在 Django 中,当您处理大量数据时,您需要一种方法来将数据分成多个页面以便于显示。这就是分页器的用途。分页器允许您将数据分成多个页面,并在每个页面上显示指定数量的数据。

Django 中的分页器使用 Python 标准库中的 Paginator 类来实现。Paginator 类是一个工厂类,用于创建和管理分页器对象。通过使用 Paginator 类,您可以轻松地将数据分成多个页面,并在每个页面上显示指定数量的数据。

学习与应用:

要学习如何在 Django 应用程序中使用分页器,您需要了解以下几个步骤:

  1. 导入 Paginator 类:在您的视图函数或模板中导入 Paginator 类。例如:
from django.core.paginator import Paginator              
  1. 创建分页器对象:使用 Paginator() 函数创建一个分页器对象。例如:
paginator = Paginator(my_queryset, per_page=10)               

其中 my_queryset 是您要分页的数据集,per_page 是每页要显示的数据量。

  1. 定义视图函数或模板:编写一个视图函数或模板来处理分页器请求。您需要使用 GET 或 POST 请求来获取分页器参数,并将数据集传递给分页器对象。例如:
def my_view(request):
    queryset = MyModel.objects.all()
    pagination_data = request.GET.get('pagination', {})
    paginator = Paginator(queryset, per_page=int(pagination_data.get('per_page', 10)))
    page_number = request.GET.get('page') or 1
    page_obj = paginator.get_page(page_number)
    serializer = MyModelSerializer(page_obj)
    return render(request, 'my_template.html', {'data': serializer.data})           

在这个例子中,我们首先从数据库中获取了一个数据集 MyModel。然后我们从请求中获取了分页器参数,并使用它们来创建一个分页器对象。接下来,我们获取了当前页面的编号,并使用它来获取对应的数据对象。最后,我们将数据对象序列化为 JSON 格式,并将其传递给模板进行渲染。

样例代码:

from django.db import models
from django.core.paginator import Paginator
from rest_framework import generics
from myapp.serializers import MyModelSerializer
from myapp.models import MyModel

class MyModelList(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = PaginationSerializerMethodField # 自定义分页字段类
    serializer_context = {'request': Request.request} # 将请求对象传递给序列化器
    pagination_class_defaults = {'per_page': 10} # 每个页面显示的数据量默认为 10 条记录
    serializer_class_defaults = {'fields': '__all__'}
# 所有字段都需要进行序列化,默认为所有字段都进行序列化
    pagination_serializer_class = PaginationSerializer 
#自定义分页序列化器类,继承自 Django Rest Framework 内置的 PaginationSerializer 类
    pagination_serializer_class_defaults = {'fields': ('count', 'per_page', 'current_page', 'total_pages')} 
#自定义分页序列化器默认包含 count、per_page、current_page、total_pages 这些字段           
Django开源框架2023-6-10(分页器)
Django开源框架2023-6-10(分页器)
Django开源框架2023-6-10(分页器)

-----更多说明-----

除了自定义分页器字段和序列化器外,您还可以使用 Django Rest Framework 中的其他功能来处理分页器请求。例如,您可以使用 RequestParser 类来解析查询字符串参数,并使用 QuerySetPaginator 类来将查询集转换为分页器对象。

此外,您还可以使用 Django Rest Framework 的内置分页器过滤器(PaginationFilter)来处理分页器请求。该过滤器允许您根据 HTTP 请求头中的分页信息来过滤查询集。例如,如果您希望只返回特定页面或特定页面大小的数据,您可以使用 PaginationFilter 来实现这一点。

以下是一个示例代码片段,演示如何使用 RequestParser 和 QuerySetPaginator 类来处理分页器请求:

from django.core.paginator import Paginator
from rest_framework import generics
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer
from rest_framework.pagination import PageNumberPagination

class MyModelList(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = PageNumberPagination 
# 自定义分页类,继承自 Django Rest Framework 内置的 PageNumberPagination 类
    serializer_context = {'request': Request.request}
# 将请求对象传递给序列化器
    pagination_class_defaults = {'per_page': 10}
# 每个页面显示的数据量默认为 10 条记录
    serializer_class_defaults = {'fields': '__all__'} 
# 所有字段都需要进行序列化,默认为所有字段都进行序列化
    pagination_serializer_class = MyModelSerializer 
#自定义分页序列化器类,继承自 MyModelSerializer 类
    pagination_serializer_class_defaults = {'fields': ('count', 'per_page', 'current_page', 'total_pages')} 
#自定义分页序列化器默认包含 count、per_page、current_page、total_pages 这些字段
    
    def get_queryset(self):
        parser = RequestParser(self.request) # 创建一个 RequestParser 实例
        parser.parse(self.request) # 解析查询字符串参数
        queryset = self.queryset.filter(some_field=parser.get('some_field'), some_other_field=parser.get('some_other_field')) 
# 根据查询字符串参数过滤查询集
        return queryset # 返回过滤后的查询集
    
class MyModelDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    pagination_class = PageNumberPagination 
# 自定义分页类,继承自 Django Rest Framework 内置的 PageNumberPagination 类
    serializer_context = {'request': Request.request} 
# 将请求对象传递给序列化器
    pagination_class_defaults = {'per_page': 10} 
# 每个页面显示的数据量默认为 10 条记录
    serializer_class_defaults = {'fields': '__all__'} 
# 所有字段都需要进行序列化,默认为所有字段都进行序列化
    pagination_serializer_class = MyModelSerializer
#自定义分页序列化器类,继承自 MyModelSerializer 类
    pagination_serializer_class_defaults = {'fields': ('count', 'per_page', 'current_page', 'total_pages')} 
#自定义分页序列化器默认包含 count、per           
Django开源框架2023-6-10(分页器)
Django开源框架2023-6-10(分页器)
Django开源框架2023-6-10(分页器)