ModelViewSet里过滤,排序,分页,序列化设置
限流Throttling
可以对接口访问的频次进行限制,以减轻服务器压力。
使用
可以在配置文件中,使用 DEAULT_THROTTLE_CLASS和 DEFAULT_THROTTLE_RATES进行全局配置,
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle',
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
},
}
DEFAULT_THROTTLE_RATES 可以使用 second,minute.hour 或 day来实名周期
过滤Filtering
对于列表数据可能需要根据字段进行过滤,我们可以通过django-fitlter扩展来增强支持
pip install django-filter
在配置文件总增加过滤后端的设置:
INSTALLED_APPS=[
....
'django_filters'
]
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS':('django_filters.rest_framework.DjangoFilterBackend',)
}
在视图中添加filter_fields属性,指定可以过滤的字段
class BookLIstView(ListAPIView):
queryset=BookInfo.objects.all()
serializer_class=BookInfoSerializer
filter_fields=('btitle','bread')
#127.0.0.1:8000/books/?btitle='西游记'
排序
对于列表数据,REST framewotk提供了ORderingFilter过滤器来帮助我们快速指明数据按照指定字段进行排序
使用方法:
在类视图中设置filter_backends,使用rest_framework.filters.OrderingFilter过滤器,REST
framework会在请求的查询字符串参数中检查是否包含了ordering参数,如果包含了ordering参数,则按照ordering参数指明的排序字段对数据集进行排序。
前端可以传递的ordering参数的可选字段值需要在ordering_fields中指明。
class BookListView(ListAPIView ):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
filter_backends = [orderingFilter]
ordering_fields = ( 'id ', 'bread ' , 'bpub_date' )
#127.0.0.1:8000/books/ ?ordering=-bread
分页PageNumberPagination
前端访问网址形式:
GET http://api.example.org/books/?page=4
可以在子类中定义的属性:
• page_size 每页数目
• page_query_param 前端发送的页数关键字名,默认为"page"
• page_size_query_param 前端发送的每页数目关键字名,默认为None
• max_page_size 前端最多能设置的每页数量
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):
page_size_query_param ='page_size'
max_page_size=10
class BookListView(ListAPIView):
queryset = BookInfo.objects.all().order_by('id')
serializer_class = BookInfoSerializer
pagination_class = StandardPageNumberPagination
# 127.0.0.1/books/?page=1&page_size=2