分页、过滤,排序、限流

分页、过滤,排序、限流,第1张

分页 全局分页

需要修改Django的全局配置文件 settings.py
在文件最后添加

REST_FRAMEWORK = {
    #全局分页
    # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    # 'PAGE_SIZE': 2    #每页展示几条数据
}
drf局部分页设置

在指定的视图类里添加局部分页

class Goodset(ModelViewSet):
    queryset = Goods.objects.all() #查询集
    serializer_class = Goodsser  #序列化器
    #局部分页
    # pagination_class = PageNumberPagination #全局分页的'PAGE_SIZE': 2 不能注释
    #也可以在网址后边加 /?page=2&size=2  查询第2页,每页2条的英雄信息
自定义分页
#导包
from rest_framework.pagination import PageNumberPagination
#自定义分页类
class pagiation(PageNumberPagination):
    max_page_size = 3 #一页最多显示多少数据
    page_size = 2  #默认一页显示多少条数据
    page_query_param = 'page' #参数,用于指定第几页
    page_size_query_param = 'size'     #参数,用于指定一页显示多少条数据

class Goodset(ModelViewSet):
    queryset = Goods.objects.all()
    serializer_class = Goodsser

    #使用自定义分页器进行分页
    # pagination_class = pagiation
过滤 安装插件

在黑窗口安装输入
pip install django-filter

注册app

在settings.py文件中注册
INSTALLED_APPS = [

‘django_filters’,

]

配置过滤引擎

在settings.py文件中最后添加

REST_FRAMEWORK = {
	#全局过滤  如果用到局部过滤这一代码可以注释
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}
精准过滤&模糊过滤

精准过滤
FilterSet`将自动为给定的字段创建一个类,并允许您发出如下请求:
http://127.0.0.1:8000/good/?name=可口可乐&kind=1(编号)

#导包
from django_filters.rest_framework import DjangoFilterBackend
class Goodset(ModelViewSet):
    queryset = Goods.objects.all()
    serializer_class = Goodsser
    #局部过滤
    # 1.准确查询
    # filter_backends = [DjangoFilterBackend] #指定过滤工具
    # filter_fields=['name','kind'] #指定准确查询的字段名

模糊过滤
FilterSet`将自动为给定的字段创建一个类,并允许您发出如下请求:
http://127.0.0.1:8000/good/?max_price=2&good_name=可

#导包
from django_filters.rest_framework import DjangoFilterBackend
import django_filters
#自定义过滤器类
class MyFilter(django_filters.rest_framework.FilterSet):
    #价格大于等于等于min_price  lte表示小于等于
    #NumberFilter对数值类型进行过滤 field_name过滤的字段 lookup_expr过滤的表达式
    min_price=django_filters.NumberFilter(field_name='price',lookup_expr='get')
    max_price=django_filters.NumberFilter(field_name='price',lookup_expr='lte')
    #CharFilter 对字符串数据进行过滤
    # icontains 表示包含
    good_name=django_filters.CharFilter(field_name='name',lookup_expr='icontains')
    #元类
    class Meta:
        model=Goods
        fields=['min_price','max_price','good_name']

class Goodset(ModelViewSet):
    queryset = Goods.objects.all()
    serializer_class = Goodsser
    # 2.模糊查询
    filter_backends = [DjangoFilterBackend]  # 指定过滤工具
    filterset_class=MyFilter  #指定模糊查询的自定义过滤器
rest_framework的SearchFilter 配置搜索引擎

在settings.py文件中最后添加

REST_FRAMEWORK = {
	#全局过滤  如果用到局部过滤这一代码可以注释
    'DEFAULT_FILTER_BACKENDS': ['rest_framework.filters.SearchFilter']
}

serch fielter 模糊查询
这将允许客户端通过执行以下查询来过滤列表中的项目:
http://127.0.0.1:8000/good/?search=可 1

#导包
from rest_framework.filters import SearchFilter
class Goodset(ModelViewSet):
    queryset = Goods.objects.all()
    serializer_class = Goodsser
    # 3.serch fielter 模糊查询
    filter_backends = {SearchFilter} #指定过滤工具
    #如果使用外键字段进行搜索,使用外键__外键字段 进行指定
    search_fields=['name','kind__id']
排序 Ordering-Filter的使用

http://127.0.0.1:8000/good/?ordering=-price # 从大到小
http://127.0.0.1:8000/good/?ordering=price # 从小到大

#导包
from rest_framework.filters import OrderingFilter
class Goodset(ModelViewSet):
    queryset = Goods.objects.all()
    serializer_class = Goodsser
    filter_backends = {OrderingFilter} #指定排序工具
    # 指定排序的字段
    ordering_fields=['price','number']
限流

在settings.py文件中最后添加

REST_FRAMEWORK = {
	#全局限流
    # 'DEFAULT_THROTTLE_CLASSES': (
    #     # 限制所有匿名未认证用户,使用IP区分用户
    #     'rest_framework.throttling.AnonRateThrottle',
    # ),
    'DEFAULT_THROTTLE_RATES': {
        # 可以使用 second, minute, hour 或day来指明周期
        'anon': '3/minute',
    }

视图类里实现

#导包
from rest_framework.throttling import AnonRateThrottle
class Goodset(ModelViewSet):
    queryset = Goods.objects.all()
    serializer_class = Goodsser
    #局部限流
    throttle_classes = [AnonRateThrottle]

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/915589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存