过滤与排序
必须继承GenericAPIView及其子类才能使用这种方法,配置过滤类的方式,用APIView的话得自己写orm与来实现搜索功能
3中过滤方式:drf内置的、第三方的、自己写的
1.drf内置过滤类【继承GenericAPIView
】
导入内置过滤器 - SearchFilter
| from rest_framework.filters import SearchFilter |
views.py -
| "内置过滤器" |
| from rest_framework.filters import SearchFilter |
| |
| |
| class BookDetailView(ViewSetMixin, RetrieveAPIView): |
| """查询单个""" |
| queryset = Book.objects.all() |
| serializer_class = BookSerializer |
| |
| |
| filter_backends = [SearchFilter] |
| |
| search_fields = ['name', 'price'] |
| |
搜索方式
地址栏中通过关键字search来进行匹配
| http://127.0.0.1:8000/api/v1/books/?search=红 |
2.第三方过滤器
导入模块
这里用到了第三方模块django-filters
| from django_filter.rest_framework import DjangoFilterBackend |
views.py
| "第三方过滤器" |
| from django_filter.rest_framework import DjangoFilterBackend |
| |
| class BookDetailView(ViewSetMixin, RetrieveAPIView): |
| """查询单个""" |
| queryset = Book.objects.all() |
| serializer_class = BookSerializer |
| |
| |
| |
| filter_backends = [DjangoFilterBackend] |
| |
| search_fields = ['name'] |
支持的查询方式
| http://127.0.0.1:9000/api/v1/books/?price=939 |
| http://127.0.0.1:9000/api/v1/books/?price=939&name=红 |
3.自定义定制过滤类实现过滤
| |
| class CommonFilter(BaseFilterBackend): |
| def filter_queryset(self, request, queryset, view): |
| |
| price_gt = request.query_params.get('price_gt', None) |
| if price_gt: |
| qs = queryset.filter(price__gt=int(price_gt)) |
| return qs |
| |
| else: |
| return queryset |
| |
| |
| class BookView(ViewSetMixin, ListAPIView): |
| queryset = Book.objects.all() |
| serializer_class = BookSerializer |
| |
| filter_backends = [CommonFilter] |
4.排序
内置排序模块
导入模块
| from rest_framework.filters import OrderingFilter |
views.py
| class BookView(ViewSetMixin, ListAPIView): |
| queryset = Book.objects.all() |
| serializer_class = BookSerializer |
| filter_backends = [OrderingFilter] |
| ordering_fields = ['price'] |
支持的查询方法
| http://127.0.0.1:8000/api/v1/books/?ordering=price |
| http://127.0.0.1:8000/api/v1/books/?ordering=-price |
| http://127.0.0.1:8000/api/v1/books/?ordering=-id,price |
分页
drf内置了三个分页器,对应三种分页方式,内置的分页类不能直接使用,需要继承,定制一些参数后才能使用
1.分页组件
| 1.PageNumberPagination 基本分页方式 |
| - http://127.0.0.1:8000/api/v1/books/?page=2&size=3 |
| |
| |
| 2.LimitOffsetPagination 偏移分页 |
| - http://127.0.0.1:8000/api/v1/books/?limit=4&offset=1 |
| - 从第一条开始,取4条 |
| |
| 3.CommonCursorPagination 游标分页 |
| - 只能下一页,上一页,不能跳到中间,但它的效率最高,大数据量分页,使用这种较好 |
2.定制分页器
page.py
| from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination |
| |
| |
| |
| class CommonPageNumberPagination(PageNumberPagination): |
| page_size = 2 |
| page_query_param = 'page' |
| page_size_query_param = 'size' |
| max_page_size = 5 |
| |
| |
| |
| class CommonLimitOffsetPagination(LimitOffsetPagination): |
| default_limit = 3 |
| limit_query_param = 'limit' |
| offset_query_param = 'offset' |
| max_limit = 5 |
| |
| |
| |
| |
| |
| class CommonCursorPagination(CursorPagination): |
| cursor_query_param = 'cursor' |
| page_size = 2 |
| ordering = 'id' |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY