DRF 排序、分页器 、过滤器

发布时间 2023-03-29 17:31:05作者: 夜久听山雨

一、排序用法

from rest_framework.filters import OrderingFilter
class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    
    #添加默认的排序功能
    filter_backends = [OrderingFilter]
    #可排序的字段指定-
    ordering_fields=("id","price") #指定2个字段才生效
   
使用方式:
http://127.0.0.1:8000/book/?ordering=-price (-为倒叙 )   

二、分页器用法

1.全局配置分页器

setting.py文件配置

REST_FRAMEWORK={
    #全局分页设置
    "DEFAULT_PAGINATION_CLASS":"rest_framework.pagination.PageNumberPagination",
    "PAGE_SIZE":10 #每页显示的个数
}

接口返回格式

{
    "count": 30,      #总数
    "next": "http://127.0.0.1:8000/book/?page=3",  #下一页的url
    "previous": "http://127.0.0.1:8000/book/",     #上一页的url
    "results": [
        {
            "id": 15,
            "title": "book10",
            "price": 19,
            "pub_date": "2020-12-12 00:00:00"
        }
    ]
}

2.自定义局部分页器

# 自定义分页函数
from rest_framework.pagination import PageNumberPagination
class DIYPagination(PageNumberPagination):
    page_size=10  #默认每页显示多少个数据
    page_size_param='page_size22'  #查询参数 默认为page
    page_size_query_param="size"   #前端控制每页展示个数 加参数&size=2
    max_page_size=4  #前端控制每页展示个数 的限制数量 即&size 最大可设置为4

class BookView(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    
    # 配置自定义的分页器
    pagination_class = DIYPagination  # 配置自定义的分页器
    # #关闭分页设置
    # pagination_class = None

三、过滤器用法

1.全局配置过滤

#依赖库安装
django-filter==22.1

setting.py 文件配置

INSTALLED_APPS = [
       'django_filters',
]

#全局drf配置
REST_FRAMEWORK={
    # 过滤器
    'DEFAULT_FILTER_BACKENDS':('django_filters.rest_framework.DjangoFilterBackend',),
}

view 使用

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
class BookView(ModelViewSet):
    queryset = Member.objects.all()
    serializer_class = BookSerializers
    filter_backends = (filters.SearchFilter,DjangoFilterBackend,filters.OrderingFilter,)  # 指定过滤器
    search_fields = ('name','sex',)  # 搜索的字段 ?search=123  注意单个字段 要加个,
    filterset_fields = ('name',) #指定可搜索的字段 ?name=123
    ordering_fields = ("id",) #?ordering=-id

2.自定义配置过滤器

//自定义过滤
from rest_framework.filters import BaseFilterBackend
from django.db.models import Q


class Myfilter(BaseFilterBackend):
    def filter_queryset(self, request, queryset, view):
        # 获取过滤参数
        qs_name = request.query_params.get('name')
        qs_price = request.query_params.get('price')
        # title__contains:精确大小写查询,SQL中-->like BINARY
        # 利用Q查询构造或关系
        if qs_name:
            queryset = queryset.filter(name__contains=qs_name)
        elif qs_price:
            queryset = queryset.filter(price__contains=qs_price)
        elif qs_name or qs_price:
            queryset = queryset.filter(Q(name__contains=qs_name) | Q(price__contains=qs_price))
        return queryset
    
    
    
 //视图类  
from app01.filter import Myfilter


class BookViewSet(ViewSetMixin, ListAPIView):
    queryset = models.Book.objects
    serializer_class = BookModelSerializer
    authentication_classes = [LoginAuth, ]
    filter_backends = [Myfilter, ]    #指定过滤器
    filterset_fields = ('name',)  # 指定可搜索的字段 ?name=123