django rest framework过滤 搜索 排序以及分页
简单过滤
直接通过get_queryset简单过滤:
lass GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
"""
商品详情页
"""
serializer_class = GoodsSerializer
#分页
pagination_class = GoodsPagination
#接受前端传递的数据
def get_queryset(self):
home = self.request.query_params.get('home')
if not home:
queryset = SongMenu.objects.all()
else:
queryset = SongMenu.objects.all().order_by('colnum')[:1]
return queryset
DjangoFilterBackend过滤
该django-filter
库包含一个DjangoFilterBackend
类,该类支持REST框架的高度可定制的字段过滤。
1.先安装django-filter
pip install django-filter
2.然后添加django_filters到Django settings的INSTALLED_APPS
INSTALLED_APPS = [
django_filters,
]
3.自定义FilterSet类
from django_filters import rest_framework as df_filters
class GoodsFilter(r_filters.FilterSet):
"""
过滤器
"""
min_price = r_filters.NumberFilter(field_name="shop_price", lookup_expr='gte', label='最小商品价格')
max_price = r_filters.NumberFilter(field_name="shop_price", lookup_expr='lte', label='最大商品价格')
top_category = r_filters.NumberFilter(method='top_category_filter')
def top_category_filter(self, queryset, name, value):
return queryset.filter(Q(category_id=value) | Q(category__parent_category_id=value) |
Q(category__parent_category__parent_category_id=value))
class Meta:
model = Goods
fields = ('min_price', 'max_price', 'is_hot', 'is_new')
4.将过滤器后端添加到单个View或ViewSet。
from django_filters.rest_framework import DjangoFilterBackend
class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
商品列表页
"""
filter_backends = (df_filters.DjangoFilterBackend,)
filterset_class = GoodsFilter
SearchFilter搜索
该SearchFilter
级支持简单单的查询参数基于搜索和基于该admin界面的搜索功能。
在使用时,可浏览的API将包含一个SearchFilter
控件
视图配置search_fields
from rest_framework import filters
class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
商品列表页
"""
filter_backends = (filters.SearchFilter, )
search_fields = ('name', "goods_brief", "goods_desc")
这将允许客户端通过查询过滤列表中的项目如:
http://example.com/api/users?search=name
您还可以执行相关的查找ForeignKey或ManyToManyField查找API双下划线符号:
search_fields = ('username', 'email', 'profile__profession')
默认情况下,搜索将使用不区分大小写的部分匹配。搜索参数可以包含多个搜索项,其应该是空格和/或逗号分隔。如果使用多个搜索项,则仅当所有提供的项匹配时,才会在列表中返回对象。
搜索行为可以通过在其中添加各种字符来限制search_fields。
- '^'开始 - 搜索。
- '='完全匹配。
- '@'全文搜索。(目前只支持Django的MySQL后端。)
- '$'正则表达式搜索。
例如:search_fields = ('=username', '=email')
OrderingFilter排序
该OrderingFilter
类支持控制结果的排序简单的查询参数。
视图配置ordering_fields
from rest_framework import filters
class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
商品列表页
"""
filter_backends = (filters.OrderingFilter, )
ordering_fields = ('sold_num', 'add_time')
分页
一.分页drf配置信息:
1.在Lib\site-packages\rest_framework\settings.py中查看:
2.简单分页在项目setting中配置:(所有get请求返回数据每页5条)
#每页五条数据
REST_FRAMEWORK={
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE':5
}
二.定制分页:
[](javascript:void(0)😉
from rest_framework.pagination import PageNumberPagination
#深度定制分页
from rest_framework.pagination import PageNumberPagination
class PlayListPageNumberPagination(PageNumberPagination):
"""歌单列表数据的分页器"""
page_query_param = "page" # 页码参数
page_size_query_param = 'page_size' # 单页数据量
page_size = 5 # 默认的单页数据量,就是每一页显示5个课程信息
max_page_size = 20 # 允许客户端设置的单页数据量
class PlaylistListAPIView(ListAPIView):
# 初步过滤
def get_queryset(self):
home = self.request.query_params.get('home')
if not home:
queryset = SongMenu.objects.all()
else:
queryset = SongMenu.objects.all().order_by('colnum')[:1]
return queryset
serializer_class = SongMenuModelSerializer
filter_backends = [DjangoFilterBackend, OrderingFilter,SearchFilter]
# django-filters过滤
filter_fields = ['tags', ]
# 搜索
# http://example.com/api/song/playlist/?search=于 => 止于唇齿 掩于岁月
# http://example.com/api/song/playlist/?search=古典 => 止于唇齿
search_fields = ['name','tags__name']
# 排序
# ordering_fields = ['id', 'students', 'price']
# http://example.com/api/song/playlist/?ordering=colnum
ordering_fields = ['colnum',]
# 分页
pagination_class = PlayListPageNumberPagination