DRF中限流、过滤、排序、分页

1.限流

settings.py中配置

REST_FRAMEWORK = {
    #   限流(防爬虫)
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    #   限流策略
    'DEFAULT_THROTTLE_RATES': {
        'user': '3/hour',  # 每小时3次
        'anon': '100/day',  # 每天能访问100次
    },

}

2.过滤

2.1在settings.py中配置

REST_FRAMEWORK = {
    #   限流(防爬虫)
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    #   限流策略
    'DEFAULT_THROTTLE_RATES': {
        'user': '1000/hour',  # 每小时100次
        'anon': '1000/day',  # 每天能访问3次
    },

    #   过滤器后端
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
        # 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化
    ],




}

2.2在serializers.py序列化

rom .models import *
from .views import *
from rest_framework import serializers

class ActorSerializers(serializers.ModelSerializer):
    class Meta:
        model = Actor   
        fields = '__all__'
        depth = 1           #外键序列化

2.3views.py

from rest_framework.viewsets import ModelViewSet
from .models import *
from .serializers import *

from django_filters.rest_framework import DjangoFilterBackend


class ActorModelView(ModelViewSet):
    queryset = Actor.objects.all()
    serializer_class = ActorSerializers

    #   过滤
    filter_backends = (DjangoFilterBackend)
    #   过滤的字段
    filter_fields = ('name', 'phone')
  • Postman测试


3.排序

3.1在settings.py中配置

REST_FRAMEWORK = {
    #   限流(防爬虫)
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    #   限流策略
    'DEFAULT_THROTTLE_RATES': {
        'user': '1000/hour',  # 每小时100次
        'anon': '1000/day',  # 每天能访问3次
    },

    #   过滤器后端
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
        # 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化
    ],

    # 5.1过滤排序(全局):Filtering 过滤排序
    'SEARCH_PARAM': 'age',
    'ORDERING_PARAM': 'ordering',

    'NUM_PROXIES': None,
}

3.2在serializers.py序列化

rom .models import *
from .views import *
from rest_framework import serializers

class ActorSerializers(serializers.ModelSerializer):
    class Meta:
        model = Actor   
        fields = '__all__'
        depth = 1           #外键序列化

2.3views.py

from rest_framework.viewsets import ModelViewSet
from .models import *
from .serializers import *

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter



class ActorModelView(ModelViewSet):
    queryset = Actor.objects.all()
    serializer_class = ActorSerializers

    #   支持过滤 与 排序
    filter_backends = (DjangoFilterBackend, OrderingFilter)
    #   过滤的字段
    filter_fields = ('name', 'phone')
    #   排序的字段
    ordering_fields = ('id', 'age')
  • Postman测试


4.分页

3.1在settings.py中配置

REST_FRAMEWORK = {
    #   限流(防爬虫)
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    #   限流策略
    'DEFAULT_THROTTLE_RATES': {
        'user': '1000/hour',  # 每小时100次
        'anon': '1000/day',  # 每天能访问3次
    },

    #   过滤器后端
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
        # 'django_filters.rest_framework.backends.DjangoFilterBackend', 包路径有变化
    ],

    # 5.1过滤排序(全局):Filtering 过滤排序
    'SEARCH_PARAM': 'age',
    'ORDERING_PARAM': 'ordering',

    'NUM_PROXIES': None,
}

3.2在serializers.py序列化

rom .models import *
from .views import *
from rest_framework import serializers

class ActorSerializers(serializers.ModelSerializer):
    class Meta:
        model = Actor   
        fields = '__all__'
        depth = 1           #外键序列化

2.3views.py

from rest_framework.viewsets import ModelViewSet
from .models import *
from .serializers import *

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework.pagination import PageNumberPagination



#   局部自定义分页
class PageNum(PageNumberPagination):
    #   代表每页返回数据数量的参数,默认值: None
    page_size_query_param = 'page_size'
    #   代表页码的参数,默认值: page
    page_query_param = 'page'
    #   一页中最多显示的条数
    # max_page_size = 2
    #   每页显示条数
    page_size = 2


class ActorModelView(ModelViewSet):
    queryset = Actor.objects.all()
    serializer_class = ActorSerializers

    #   分页
    pagination_class = PageNum
    #   过滤 与 排序
    filter_backends = (DjangoFilterBackend, OrderingFilter)
    #   过滤的字段
    filter_fields = ('name', 'phone')
    #   排序的字段
    ordering_fields = ('id', 'age')
  • Postman测试

posted @ 2020-10-28 18:54  Daniel*  阅读(103)  评论(0编辑  收藏  举报