分页器:可以使用的类
PageNumberPagination:将页码拼接在url后面 GET https://api.example.org/accounts/?page=4
LimitOffsetPagination:利用偏移量和数据条数取 GET https://api.example.org/accounts/?limit=100&offset=400
自定义分类器继承已有的,加以修改:
# 自定义分页器
class MoviePagination(PageNumberPagination):
# 每页数量
page_size = 5
# 请求时将page改名为p
page_query_param = 'p'
# 最大可请求页数
max_page_size = 20
配置:全局配置:在settings里
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
}
局部配置:添加在类视图cbv上
class MovieListViewSet(ListModelMixin, GenericViewSet):
queryset = Movie.objects.all()
serializer_class = MovieListSerializer
# 添加分页
pagination_class = LimitOffsetPagination
# 局部添加定制身份权限认证
# 设置需要身份验证的类
authentication_classes = [BasicAuthentication, SessionAuthentication, JWTAuthentication]
# 全类权限认证
permission_classes = [IsAuthenticated, ]
过滤器筛选:
API:
安装:pip install django-filter
将'django_filters',添加到应用
1.DjangoFilterBackend:
from django_filters.rest_framework import DjangoFilterBackend
全局设置在settings里
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}
局部设置:
# 过滤器可多个
filter_backends = [DjangoFilterBackend, SearchFilter]
# Backend过滤字段设置
filterset_fields = ['total', 'number']
2.SearchFilter:
from rest_framework.filters import SearchFilter
# 过滤器可多个
filter_backends = [SearchFilter,]
# 搜索过滤字段设置
search_fields = ['showname', ]
还可以使用查找 API 双下划线表示法对 ForeignKey 或 ManyToManyField 执行相关查找:
search_fields = ['username', 'email', 'profile__profession']
搜索行为可以通过在 search_fields.
'^' 以搜索开始。
'=' 完全匹配。
'@' 全文搜索。 (目前只支持 Django 的 PostgreSQL 后端 。)
'$' 正则表达式搜索。
例如:
search_fields = ['=username', '=email']
3.OrderingFilter:字段排序
from rest_framework.filters import OrderingFilter
# 过滤器可多个
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
# 排序字段设置
ordering_fields = ['number', 'total']
4.自定义过滤器
在应用里建一个filter.py文件写入
class OrderFilter(FilterSet):
# 设置过滤字段及条件,默认为相等匹配
totalmax = django_filters.NumberFilter(field_name='total', lookup_expr='gte')
totalmin = django_filters.NumberFilter(field_name='total', lookup_expr='lte')
movie_id = django_filters.NumberFilter(field_name='movie_id')
# 自定义过滤,条件不符合执行另一个
def movie_id_filter(self, queryset, name, value):
result = queryset.filter(Q(movie_id=value) | Q(user__order__movie_id=value))
return result
class Meta:
model = Order
fields = ['total', ]
API接口
过程:写serializers.py
写view.py