1. 程式人生 > 實用技巧 >分頁 restframe work 排序,分頁,自定義過濾

分頁 restframe work 排序,分頁,自定義過濾

from rest_framework.viewsets import ModelViewSet
from  .serializers import SerializerStudent
from rest_framework.response import Response
from django.http import Http404
from django_filters.rest_framework import DjangoFilterBackend
from django_filters.rest_framework import FilterSet
from django_filters import rest_framework
from rest_framework.filters import SearchFilter,OrderingFilter
from . models import Student
from rest_framework.pagination import PageNumberPagination

class MyPagiNation(PageNumberPagination):
    """ 區域性分頁類"""
    page_size_query_param = "page_size"
    max_page_size = 3

class MyFilter(FilterSet):
    """自定義過濾規則類"""
    class_id=rest_framework.NumberFilter(field_name="class_id",lookup_expr="exact")
    name=rest_framework.CharFilter(field_name="name",lookup_expr="icontains")

    class Meta:
        model=Student
        fields=("id","class_id","name")



class StudentModelView(ModelViewSet):
    queryset = Student.objects.filter(is_delete=False).all()
    serializer_class = SerializerStudent
    def destroy(self, request, *args, **kwargs):
        try:
            instance = self.get_object()
            instance.is_delete = True
            instance.save()
            serializer=self.get_serializer(instance=instance)
            data= True if serializer.data.get("is_delete") else False
            return Response(data=data)
        except  Http404:
            return Response(data=False)

    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
    #自定義過濾rule
    filter_class =MyFilter
    # 如果要允許對某些欄位進行過濾,可以使用filter_fields屬性
    #filter_fields=()
    # 搜尋過濾
    search_fields = ('name')
    # 排序
    ordering_fields =["-class_id"]
    # 分頁類
    pagination_class = MyPagiNation

 

修改settings.py 配置過濾器:

REST_FRAMEWORK={

    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend',],

}