在Django REST Framework (DRF) 中,APIView
是一个强大的基础类,允许你以灵活的方式构建API视图。为了高效地构建支持分页的查询接口,你可以结合使用 APIView
和 DRF 的分页功能。以下是实现步骤:
首先,确保你已经安装了 djangorestframework
,并在 settings.py
中进行了配置。
INSTALLED_APPS = [
...
'rest_framework',
...
]
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 10, # 默认每页显示的记录数
}
假设你有一个 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']
在 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)
在 urls.py
中配置路由,将视图映射到URL。
# urls.py
from django.urls import path
from .views import BookListAPIView
urlpatterns = [
path('books/', BookListAPIView.as_view(), name='book-list'),
]
启动Django开发服务器并访问 /books/
路径,你应该能够看到分页后的书籍列表。你可以通过查询参数 page
和 page_size
来控制分页行为。
例如:
- /books/
- 返回第一页的10条记录。
- /books/?page=2
- 返回第二页的10条记录。
- /books/?page_size=20
- 返回第一页的20条记录。
如果你需要更复杂的分页逻辑,可以自定义分页类。例如,你可以实现基于游标的分页或其他分页策略。
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 的分页功能,你可以轻松构建支持分页的查询接口。你可以根据需求自定义分页类,或者使用默认的分页设置。这种方法不仅高效,而且灵活,适用于大多数场景。