django rest framework過濾 搜索 排序以及分頁


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中查看:

img

​ 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM