1.Django中的过滤filter
过滤就是获取指定条件的数据。
Django-filter库包含一个DjangoFilterBackend类,该类支持REST框架的高度可定制的字段过滤
1.1 安装
安装Django-filter
pip install django-filter==21.1
1.2 使用
配置
setting:
REST_FRAMEWORK = {
# 默认的验证是按照验证列表 从上到下 的验证
'DEFAULT_AUTHENTICATION_CLASSES': (
# 配置JWT认证
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
# 配置session_id认证
'rest_framework.authentication.SessionAuthentication',
# 配置默认的认证方式 base:账号密码验证
'rest_framework.authentication.BasicAuthentication',
),
# 指定过滤后端
"DEFAULT_FILTER_BACKENDS":['django_filters.rest_framework.DjangoFilterBackend'],
}
views中添加过滤字段
`class StudentsView(generics.ListCreateAPIView):
# 指定需要操作的数据与序列化类
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 添加身份验证功能
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
# 标识匿名用户访问
# throttle_classes = [app_throttles.AnonymousThrottle]
# 指定视图节流类
throttle_scope = "students"
# 添加过滤条件
filter_fields = {'name','sex'}
# 重写新增方法,在保存Student时候关联用户
def perform_create(self, serializer):
serializer.save(owner=self.request.user)`
使用 单个字段多个都可以
2. 排序
views
from rest_framework.filters import OrderingFilter
class StudentsView(generics.ListCreateAPIView):
# 指定需要操作的数据与序列化类
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 添加身份验证功能
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
# 标识匿名用户访问
# throttle_classes = [app_throttles.AnonymousThrottle]
# 指定视图节流类
throttle_scope = "students"
# 添加过滤条件
filter_fields = {'name','sex'}
# 排序
filter_backends=[OrderingFilter]
order_fields = {'id', 'age'}
使用
3. 分页
3.1 方法1
REST framework提供了分页的支持。
通过自定义Pagination类,为视图类添加不同的分页行为,在视图中通过pagination_class属性来指明
views
from rest_framework.pagination import PageNumberPagination
# 定义分页
class LargeResultsSetPagiation(PageNumberPagination):
page_size = 2 # 默认每页显示多少条数据
max_page_size = 5 # 前端在控制每页显示多少条时,不可以超过5
page_query_param = 'page' # 前端在查询字符串的关键字,指定显示第几页名字,不指定默认时page
page_size_query_param = 'page_size' # 前端在查询关键字名字,是用来控制每页显示多少条的关键字
# 优化代码:
class StudentsView(generics.ListCreateAPIView):
# 指定需要操作的数据与序列化类
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 添加身份验证功能
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
# 标识匿名用户访问
# throttle_classes = [app_throttles.AnonymousThrottle]
# 指定视图节流类
throttle_scope = "students"
# 添加过滤条件
filter_fields = {'name','sex'}
# 排序
filter_backends=[OrderingFilter]
order_fields = {'id', 'age'}
# 指定分页类
pagination_class = LargeResultsSetPagiation
3.2 方法2
分页offset
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
class LimitOffset(LimitOffsetPagination):
default_limit = 2 # 不指定看几条,默认就两条
max_limit = 5 # 限制前端每次最多能看几条
limit_query_param = 'limit'
offset_query_param = 'offset'
# 优化代码:
class StudentsView(generics.ListCreateAPIView):
# 指定需要操作的数据与序列化类
queryset = Student.objects.all()
serializer_class = StudentSerializer
# 添加身份验证功能
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
# 标识匿名用户访问
# throttle_classes = [app_throttles.AnonymousThrottle]
# 指定视图节流类
throttle_scope = "students"
# 添加过滤条件
filter_fields = {'name','sex'}
# 排序
filter_backends=[OrderingFilter]
order_fields = {'id', 'age'}
# 指定分页类
# pagination_class = LargeResultsSetPagiation
pagination_class = LimitOffset