插件窝 干货文章 如何使用DRF的APIView高效构建支持分页的查询接口?

如何使用DRF的APIView高效构建支持分页的查询接口?

PAGE Framework import CLASS 950    来源:    2025-03-15

在Django REST Framework (DRF) 中,APIView 是一个强大的基础类,允许你以灵活的方式构建API视图。为了高效地构建支持分页的查询接口,你可以结合使用 APIView 和 DRF 的分页功能。以下是实现步骤:

1. 安装和配置DRF

首先,确保你已经安装了 djangorestframework,并在 settings.py 中进行了配置。

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,  # 默认每页显示的记录数
}

2. 创建模型和序列化器

假设你有一个 Book 模型,并且你想为它创建一个支持分页的查询接口。

# models.py
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_date = models.DateField()

    def __str__(self):
        return self.title

创建一个序列化器来序列化 Book 模型。

# serializers.py
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['id', 'title', 'author', 'published_date']

3. 创建APIView并实现分页

views.py 中,创建一个继承自 APIView 的视图,并使用 DRF 的分页功能。

# views.py
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Book
from .serializers import BookSerializer
from rest_framework.pagination import PageNumberPagination

class BookPagination(PageNumberPagination):
    page_size = 10  # 每页显示的记录数
    page_size_query_param = 'page_size'  # 允许客户端通过查询参数自定义每页记录数
    max_page_size = 100  # 每页最大记录数

class BookListAPIView(APIView):
    def get(self, request, format=None):
        books = Book.objects.all()
        paginator = BookPagination()
        result_page = paginator.paginate_queryset(books, request)
        serializer = BookSerializer(result_page, many=True)
        return paginator.get_paginated_response(serializer.data)

4. 配置URL

urls.py 中配置路由,将视图映射到URL。

# urls.py
from django.urls import path
from .views import BookListAPIView

urlpatterns = [
    path('books/', BookListAPIView.as_view(), name='book-list'),
]

5. 测试API

启动Django开发服务器并访问 /books/ 路径,你应该能够看到分页后的书籍列表。你可以通过查询参数 pagepage_size 来控制分页行为。

例如: - /books/ - 返回第一页的10条记录。 - /books/?page=2 - 返回第二页的10条记录。 - /books/?page_size=20 - 返回第一页的20条记录。

6. 自定义分页类(可选)

如果你需要更复杂的分页逻辑,可以自定义分页类。例如,你可以实现基于游标的分页或其他分页策略。

class CustomPagination(PageNumberPagination):
    page_size = 20
    page_size_query_param = 'page_size'
    max_page_size = 100
    page_query_param = 'p'

然后在视图中使用这个自定义分页类。

class BookListAPIView(APIView):
    pagination_class = CustomPagination

    def get(self, request, format=None):
        books = Book.objects.all()
        paginator = self.pagination_class()
        result_page = paginator.paginate_queryset(books, request)
        serializer = BookSerializer(result_page, many=True)
        return paginator.get_paginated_response(serializer.data)

总结

通过使用 APIView 和 DRF 的分页功能,你可以轻松构建支持分页的查询接口。你可以根据需求自定义分页类,或者使用默认的分页设置。这种方法不仅高效,而且灵活,适用于大多数场景。