django_filter,Search_Filter,Order_Filter,分頁


一.分頁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
}

 二.定制分頁:

from rest_framework.pagination import PageNumberPagination
#深度定制分頁
class GoodsPagination(PageNumberPagination):
    page_size = 12
    page_size_query_param = 'page_size'
    #名稱
    page_query_param = 'page'
    #單頁數量最多
    max_page_size = 100


class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
    """
    商品詳情頁,分頁,搜索,過濾,排序
    """
    #配置ip限制訪問次數
    throttle_classes = (UserRateThrottle,AnonRateThrottle)
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    #分頁,調用分頁定制類
    pagination_class = GoodsPagination

 三.過濾:

  直接通過get_queryset簡單過濾:

lass GoodsListViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
     """
     商品詳情頁
     """
     serializer_class = GoodsSerializer
     #分頁
     pagination_class = GoodsPagination
     def get_queryset(self):
#接受前端傳遞的數據
           queryset = Goods.objects.all()
           min_price = self.request.query_params.get('price_min',0) 
if min_price:
queryset=queryset.filter(shop_price__gt=int(min_price)) return queryset

   通過filter進行過濾:

    安裝:pip install django-filter

    注冊app:把django-filters注冊到setting中的install-app中

    在view中導入from django_filters.rest_framework import DjangoFilterBackend,並在viewset中寫入filter_backends=(DjangoFilterBackend,)

from django_filters.rest_framework import DjangoFilterBackend


class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
    """
    商品詳情頁,分頁,搜索,過濾,排序
    """
    #配置ip限制訪問次數
    throttle_classes = (UserRateThrottle,AnonRateThrottle)
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    #分頁
    pagination_class = GoodsPagination
    #配置認證類,防止公開網頁(未登錄可查看)不能訪問
    # authentication_classes = (TokenAuthentication,)
    filter_backends=(DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)
    #字段過濾(DjangoFilterBackend)
    # filter_fields = ('name', 'shop_price')
#定制的filter
filter_class=GoodsFilter #搜索過濾(rest_framework.filters.SearchFilter) search_fields = ('name','goods_brief','goods_desc') #排序過濾(rest_frameworkfilters.OrderingFilter) ordering_fields = ('sold_num', 'shop_price') def retrieve(self, request, *args, **kwargs): instance = self.get_object() instance.click_num+=1 instance.save() serializer = self.get_serializer(instance) return Response(serializer.data)

 

  定制的篩選器:

 1 import django_filters
 2 from django.db.models import Q
 3 
 4 from .models import Goods
 5 
 6 
 7 class GoodsFilter(django_filters.rest_framework.FilterSet):
 8     #help_text--docs:description
 9     pricemin=django_filters.NumberFilter(field_name='shop_price',lookup_expr='gte',help_text='最低價格')
10     pricemax=django_filters.NumberFilter(field_name='shop_price',lookup_expr='lte')
11     # name=django_filters.CharFilter(field_name='name',lookup_expr='icontains')
12     top_category=django_filters.NumberFilter(method='top_category_filter')
13     #定制的過濾方法
14     def top_category_filter(self,queryset,name,value):
15         return queryset.filter(Q(category_id=value)|Q(category__parent_category_id=value)|Q(category__parent_category__parent_category_id=value))
16 
17 
18     class Meta:
19         model=Goods
20         fields=['pricemin','pricemax','top_category','is_hot','is_new']

 四.搜索和排序:

  搜索:

 

from rest_framework import filters

class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
    """
    商品詳情頁,分頁,搜索,過濾,排序
    """
    #配置ip限制訪問次數
    throttle_classes = (UserRateThrottle,AnonRateThrottle)
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    #分頁
    pagination_class = GoodsPagination
    #配置認證類,防止公開網頁(未登錄可查看)不能訪問
    # authentication_classes = (TokenAuthentication,)
    filter_backends=(DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter) #字段過濾(DjangoFilterBackend)
    # filter_fields = ('name', 'shop_price')
    filter_class=GoodsFilter
    #搜索過濾(rest_framework.filters.SearchFilter)
    search_fields = ('name','goods_brief','goods_desc')
    #排序過濾(rest_frameworkfilters.OrderingFilter)
    ordering_fields = ('sold_num', 'shop_price')

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.click_num+=1
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

   排序:

指定可以針對哪些字段進行排序

建議您明確指定API應在訂購過濾器中允許哪些字段。您可以通過ordering_fields在視圖上設置屬性來執行此操作,如下所示:

class UserListView(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer filter_backends = (filters.OrderingFilter,) ordering_fields = ('username', 'email')

這有助於防止意外數據泄漏,例如允許用戶針對密碼哈希字段或其他敏感數據進行排序。

如果ordering_fields在視圖上指定屬性,則篩選器類將默認允許用戶篩選serializer_class屬性指定的序列化程序上的任何可讀字段

如果您確信視圖使用的查詢集不包含任何敏感數據,則還可以使用特殊值明確指定視圖應允許對任何模型字段或查詢集合進行排序'__all__'

class BookingsListView(generics.ListAPIView): queryset = Booking.objects.all() serializer_class = BookingSerializer filter_backends = (filters.OrderingFilter,) ordering_fields = '__all__'

指定默認排序

如果ordering在視圖上設置屬性,則將其用作默認排序。

通常,您可以通過設置order_by初始查詢集來控制它,但是使用ordering視圖上參數允許您以一種方式指定排序,然后可以將其作為上下文自動傳遞給呈現的模板。如果列標題用於排序結果,則可以自動呈現列標題。

class UserListView(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer filter_backends = (filters.OrderingFilter,) ordering_fields = ('username', 'email') ordering = ('username',)

ordering屬性可以是字符串或字符串的列表/元組。

from rest_framework import filters

class GoodsListViewSet(CacheResponseMixin,mixins.ListModelMixin,mixins.RetrieveModelMixin,viewsets.GenericViewSet):
    """
    商品詳情頁,分頁,搜索,過濾,排序
    """
    #配置ip限制訪問次數
    throttle_classes = (UserRateThrottle,AnonRateThrottle)
    queryset = Goods.objects.all()
    serializer_class = GoodsSerializer
    #分頁
    pagination_class = GoodsPagination
    #配置認證類,防止公開網頁(未登錄可查看)不能訪問
    # authentication_classes = (TokenAuthentication,)
    filter_backends=(DjangoFilterBackend,filters.SearchFilter,filters.OrderingFilter)
    #字段過濾(DjangoFilterBackend)
    # filter_fields = ('name', 'shop_price')
    filter_class=GoodsFilter
    #搜索過濾(rest_framework.filters.SearchFilter)
    search_fields = ('name','goods_brief','goods_desc')
    #排序過濾(rest_frameworkfilters.OrderingFilter)
    ordering_fields = ('sold_num', 'shop_price')

    def retrieve(self, request, *args, **kwargs):
        instance = self.get_object()
        instance.click_num+=1
        instance.save()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)

 

  

 


免責聲明!

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



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