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