Django rest framework 搜索、排序和分页

搜索和排序都是 rest framework 的 filters 过滤中的一部分。

分页是 rest framework 的 pagination,下面介绍的基本功能。

一、 搜索 from rest_framework.filters import SearchFilter

根据指定的数据和指定的字段进行搜索

view 中指定要使用的过滤后端 filter_backends

1. 在 view 中设置要参与搜索的字段
python 复制代码
class CustomerList(generics.ListCreateAPIView):
    filter_backends = [SearchFilter, ]
    search_fields = ['email', 'username']
一些特殊的搜索方式
  • ForeignKeyManyToManyField 时可以关联搜索
python 复制代码
search_fields = ('username', 'email', 'profile__profession')
  • 可以通过在 search_fields 前面添加各种字符来限制搜索行为
    ^ 以指定内容开始
    = 完全匹配
    @ 全文搜索(目前只支持Django的MySQL后端)
    $ 正则搜索
python 复制代码
search_fields = ('=username', '=email')

默认情况下,搜索参数名为 search,但这可以通过使用 SEARCH_PARAM 设置覆盖。

2. 在 url 中添加过滤信息
python 复制代码
# url.py
auth_uesr_url = [
    path('<str:username>', AuthUserList.as_view()),
]

# view.py

from rest_framework import generics

class AuthUserList(generics.ListCreateAPIView):

    serializer_class = AuthUserSerializers
    pagination_class = SysAdminBasePagination

    def get_queryset(self):
        username = self.kwargs['username']
        queryset = AuthUser.objects.filter(username=username)
        return queryset
3. 获取 url 中 ?username=xxx 参数进行过滤
python 复制代码
from rest_framework import generics

class AuthUserList(generics.ListCreateAPIView):

    serializer_class = AuthUserSerializers
    pagination_class = SysAdminBasePagination

    def get_queryset(self):
        username = self.request.query_params['username']
        queryset = AuthUser.objects.filter(username=username)
        return queryset

二、排序 from rest_framework.filters import OrderingFilter

view 中指定要使用的过滤后端 filter_backends

1. 在 view 中设置要参与排序的字段
python 复制代码
class CustomerList(generics.ListCreateAPIView):
    # 在字段前面加 `-` 号可以倒序排列
    ordering_fields = ['created_at', ]
2. 从 api web 上看多了一个 ordering 字段 如下图

三、分页 from rest_framework.pagination import PageNumberPagination

1. 默认分页 PageNumberPagination

可以继承 PageNumberPagination 来定义一些默认的数据,比如每页条数,默认第几页等

page_query_param: 用于分页控件的查询参数的名称。

例如 ?page=页码 定义代表页码的属性

page_size: 页面大小的数值。这个也可以设置全局 在 Django setting.pyREST_FRAMEWORKPAGE_SIZE

page_size_query_param: 允许客户端自定义每页的条数的名称

例如:page_size_query_param = 'page_size'

max_page_size: 和 page_size_query_param 联合使用,每页最大数

template: 可以指定分页的模板

python 复制代码
from rest_framework.pagination import PageNumberPagination


class BasePagination(PageNumberPagination):
    # ?page=页码  
    page_query_param = 'page'
    # ?page=页码 
    page_size = 10
    # ?page=页码&page_size=条数 
    page_size_query_param = 'page_size'
    max_page_size = 10

class CustomerList(generics.ListCreateAPIView):
    pagination_class = BasePagination
2. 自定义分页

自定分页需要继承 BasePagination ,重写 paginate_queryset(self, queryset, request, view=None)get_paginated_response(self, data)

  • paginate_queryset:方法被传递给初始的queryset,它应该返回一个iterable对象,该对象只包含请求页中的数据
  • get_paginated_response:方法传递序列化的页数据,并应返回一个 Response

示例:

python 复制代码
from rest_framework.pagination import import BasePagination
class CustomPagination(pagination.PageNumberPagination):
    def get_paginated_response(self, data):
        return Response({
            'links': {
               'next': self.get_next_link(),
               'previous': self.get_previous_link()
            },
            'count': self.page.paginator.count,
            'results': data
        })
相关推荐
vx_biyesheji00014 小时前
Python 全国城市租房洞察系统 Django框架 Requests爬虫 可视化 房子 房源 大数据 大模型 计算机毕业设计源码(建议收藏)✅
爬虫·python·机器学习·django·flask·课程设计·旅游
vx_biyesheji000112 小时前
计算机毕业设计:Python多源新闻数据智能舆情挖掘平台 Flask框架 爬虫 SnowNLP ARIMA 可视化 数据分析 大数据(建议收藏)✅
爬虫·python·机器学习·数据分析·django·flask·课程设计
Mr数据杨12 小时前
【Dv3Admin】Django一键配置权限规则
python·django·sqlite
小陈工14 小时前
2026年3月22日技术资讯洞察:数据库优化进入预测时代,网络安全威胁全面升级
java·开发语言·数据库·python·安全·web安全·django
vx_biyesheji000115 小时前
计算机毕业设计:Python全栈图书数据挖掘与可视化看板 Django框架 爬虫 当当图书 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·数据挖掘·django·毕业设计·课程设计
B站_计算机毕业设计之家1 天前
计算机毕业设计:Python当当网图书数据全链路处理平台 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·django·flask·pandas·课程设计
q_35488851531 天前
计算机毕业设计:Python当当网图书大数据分析平台 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
大数据·爬虫·python·机器学习·数据分析·django·课程设计
q_35488851532 天前
计算机毕业设计源码:Python动漫智能推荐与可视化分析系统 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型(建议收藏)✅
python·scrapy·数据分析·django·课程设计·旅游·推荐算法
B站计算机毕业设计之家2 天前
Python 基于协同过滤的动漫推荐与数据分析平台 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型 计算机毕业设计(建议收藏)✅
大数据·python·scrapy·数据分析·django·课程设计·推荐算法
B站计算机毕业设计之家2 天前
计算机毕业设计源码:Python图书数据智能采集与可视化大屏 当当网 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·信息可视化·django·pandas·课程设计