搜索和排序都是 rest framework 的
filters过滤中的一部分。
分页是 rest framework 的pagination,下面介绍的基本功能。
一、 搜索 from rest_framework.filters import SearchFilter
根据指定的数据和指定的字段进行搜索
在view中指定要使用的过滤后端filter_backends
1. 在 view 中设置要参与搜索的字段
class CustomerList(generics.ListCreateAPIView):
filter_backends = [SearchFilter, ]
search_fields = ['email', 'username']
一些特殊的搜索方式
- 有
ForeignKey或ManyToManyField时可以关联搜索
search_fields = ('username', 'email', 'profile__profession')
- 可以通过在
search_fields前面添加各种字符来限制搜索行为
'^' 以指定内容开始
'=' 完全匹配
'@' 全文搜索(目前只支持Django的MySQL后端)
'$' 正则搜索
search_fields = ('=username', '=email')
从 api web 上看多了一个 search 字段 如下图
image.png
默认情况下,搜索参数名为
search,但这可以通过使用 SEARCH_PARAM 设置覆盖。
2. 在 url 中添加过滤信息
# 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 参数进行过滤
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 中设置要参与排序的字段
class CustomerList(generics.ListCreateAPIView):
# 在字段前面加 `-` 号可以倒序排列
ordering_fields = ['created_at', ]
2. 从 api web 上看多了一个 ordering 字段 如下图
image.png
三、分页 from rest_framework.pagination import PageNumberPagination
1. 默认分页 PageNumberPagination
可以继承
PageNumberPagination来定义一些默认的数据,比如每页条数,默认第几页等
page_query_param: 用于分页控件的查询参数的名称。
例如 ?page=页码 定义代表页码的属性
page_size: 页面大小的数值。这个也可以设置全局 在 Django setting.py 的 REST_FRAMEWORK 中 PAGE_SIZE
page_size_query_param: 允许客户端自定义每页的条数的名称
例如:page_size_query_param = 'page_size'
max_page_size: 和 page_size_query_param 联合使用,每页最大数
template: 可以指定分页的模板
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
示例:
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
})










网友评论