排序、过滤、分页
1. 排序
1.1 使用条件
http://127.0.0.1:8008/app01/api/v1/books/?ordering=price
1.2 使用排序
from rest_framework.filters import OrderingFilter
class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
queryset = Book_new.objects.all()
serializer_class = Book_newSerializer
filter_backends = [OrderingFilter]
ordering_fields = ['price']
1.3 定制返回格式
def list(self, request, *args, **kwargs):
books = self.get_queryset()
serializer = self.get_serializer(books, many=True)
return Response({"code": 100, "msg": "成功", "results": serializer.data})
def list(self, request, *args, **kwargs):
return super().list(request, *args, **kwargs)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, many=True)
return Response({"code": 100, "msg": "成功", "results": serializer.data})
2. 过滤
2.1 过滤的三种方式
2.2 内置的多个字段模糊匹配
2.2.1 使用方式一 单独使用
from rest_framework.filters import SearchFilter
class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
queryset = Book_new.objects.all()
serializer_class = Book_newSerializer
filter_backends = [SearchFilter]
search_fields = ['name']

2.2.2 使用方式二 与排序一起使用
from rest_framework.filters import SearchFilter
class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
queryset = Book_new.objects.all()
serializer_class = Book_newSerializer
filter_backends = [OrderingFilter,SearchFilter]
ordering_fields = ['price']
search_fields = ['name',]

2.3 第三方过滤,按名字精准匹配
2.3.1 使用方式
from django_filters.rest_framework import DjangoFilterBackend
class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
queryset = Book_new.objects.all()
serializer_class = Book_newSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['price']

2.4 自定义过滤类
2.4.1 如何自定义
2.4.2 过滤类
from django.db.models import Q
from rest_framework.filters import BaseFilterBackend
class CommonFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
price = request.query_params.get('price', None)
name = request.query_params.get('name', None)
if price and name:
print(1)
queryset = queryset.filter(Q(price=price) | Q(name__contains=name))
elif price:
print(2)
queryset = queryset.filter(price=price)
elif name:
print(3)
queryset = queryset.filter(name__contains=name)
return queryset
2.4.3 使用
class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
queryset = Book_new.objects.all()
serializer_class = Book_newSerializer
filter_backends = [CommonFilter]
3. 分页
3.1 定义分页类
from rest_framework.pagination import CursorPagination,LimitOffsetPagination,PageNumberPagination
class CommonPageNumberPagination(PageNumberPagination):
page_size = 2
page_query_param = 'page'
page_size_query_param = 'size'
max_page_size = 10
class CommonLimitOffsetPagination(LimitOffsetPagination):
default_limit = 2
limit_query_param = 'limit'
offset_query_param = 'offset'
max_limit = 10
class CommonCursorPagination(CursorPagination):
cursor_query_param = 'cursor'
page_size = 2
ordering = 'id'
3.2 视图类中使用
class BookView(GenericViewSet, ListCreateAPIView, RetrieveUpdateAPIView):
queryset = Book_new.objects.all()
serializer_class = Book_newSerializer
pagination_class = CommonPageNumberPagination
pagination_class = CommonLimitOffsetPagination
pagination_class = CommonCursorPagination
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构