DjangoRestFramework 實現分頁功能與搜尋功能

cA7dEm0n發表於2019-08-15

初次接觸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_typeid列表,返回列表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

至此,完成對搜尋器與分頁器的簡單介紹.

欲目千里,更上一層

相關文章