初次接觸Django Rest Framework
架構,對分頁
功能、搜尋
功能做記錄.
分頁器的實現官網介紹有兩種方式:
-
配置檔案配置
-
繼承父類完成自定義分頁器
分析分頁器原始碼
自定義分頁器主要是繼承PageNumberPagination
,改寫get_paginated_response
方法與paginate_queryset
方法.
其中
get_paginated_response
主要是編寫分頁器的返回結果.
需求示例:
前端採用iView
元件中的分頁器,該前端分頁器主要接收總頁數與當前頁數.所以後端需要返回資料,並且返回一個總頁數.
class MyPagination(PageNumberPagination):
# 指定每一頁的個數,預設為配置檔案裡面的PAGE_SIZE
page_size = 10
# 可以讓前端指定每頁個數,預設為空,這裡指定page_size去指定顯示個數
page_size_query_param = 'page_size'
# 可以讓前端指定頁碼數,預設就是page引數去接收
page_query_param = 'page'
# 指定返回格式,根據需求返回一個總頁數,資料存在results字典裡返回
def get_paginated_response(self, data):
from collections import OrderedDict
return Response(OrderedDict([('count', self.page.paginator.count), ('results',data)]))
view.py
def get(self, request, format=None):
pagination_class = MyPagination()
# 資產列表庫
assets_lists = AssetsList.objects.all().order_by('id')
# 例項化查詢
page_query = pagination_class.paginate_queryset(queryset=assets_lists, request=request, view=self)
# 序列化及結果返回
result_serializer = AssetsListSerializer(page_query,many=True)
page_result = pagination_class.get_paginated_response(result_serializer.data)
return page_result
搜尋器
分析原始碼,搜尋器是對models.Q
做條件查詢.
場景1:
多個欄位中包含搜尋關鍵字返回
from rest_framework import filters
def get(self, request, format=None):
# 例項化搜尋器
search_class = filters.SearchFilter()
# 資產列表
assets_lists = AssetsList.objects.all().order_by('id')
# 指定需要搜尋的欄位,這些欄位包含搜尋關鍵字就返回結果;根據原始碼,搜尋支援模糊匹配,精準匹配,正則匹配等
self.search_fields = ['id', 'property_number']
# 搜尋結果
search_query = search_class.filter_queryset(request, assets_lists, self)
result_serializer = AssetsListSerializer(search_query,many=True)
return result_serializer.data
場景2:
顯示多個型別結果
def post(self, request, format=None):
view_types = request.data.get('types', '')
if view_types:
# 根據assets_type的id欄位
queries = [
models.Q(**{LOOKUP_SEP.join(["assets_type__id", 'iexact']): type_name})
for type_name in json.loads(view_types)]
query_set = AssetsList.objects.filter(reduce(operator.or_, queries))
傳入assets_type
id列表,返回列表id
型別結果
分頁器與搜尋器
對搜尋結果進行分頁
def get(self, request, format=None):
pagination_class = MyPagination()
search_class = filters.SearchFilter()
# 需要搜尋的欄位
self.search_fields = ['id', 'property_number', 'specification_model','registration_card_number']
# 資產列表
assets_lists = AssetsList.objects.all().order_by('id')
# 例項化搜尋查詢器
search_query = search_class.filter_queryset(request, assets_lists, self)
# 例項化分頁器
page_query = pagination_class.paginate_queryset(queryset=search_query, request=request, view=self)
# 返回序列化
result_serializer = AssetsListSerializer(page_query, many=True)
# 分頁返回
page_result = pagination_class.get_paginated_response(result_serializer.data)
return page_result
至此,完成對搜尋器與分頁器的簡單介紹.