DRF 排序、分页器 、过滤器
一、排序用法
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
分类:
drf
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)