四、DRF框架中的GenericAPIView
GenericAPIView提供了分页、排序、过滤的功能
继承GenericAPIView之后,往往需要在类属性中指定查询集和序列化器类
过滤排序
安装django-filter
OrderingFilter:排序过滤引擎
filter_backends = [DjangoFilterBackend,OrderingFilter]:filter_backends指定过滤引擎,如果在全局配置文件中,已经指定,那么这里无需指定,这里比全局指定优先级高
filterset_fields:指定过滤字段,’把需要过滤的字段放在这个列表里,字段只能是模型类中的字段。比如端传过来的name=‘项目’,那么后端会返回name=‘项目’的那条记录
ordering_fields :接口返回的字段排序,比如在访问接口时后面加上ordering=id,默认按id进行升序,路径参数前面加减号(ordering=-id),就是降序,如:ordering_fields = ['id', 'name', 'leader']
提供了四个方法
get_queryset()方法:获取查询集,尽量用这个来获取,因为如果直接通过Projects.objects.all()来获取的话,如果这个对象被改了,那么就会出问题
get_object()方法:根据前端传的pk值获取查询集中的某条记录,返回模型类对象,这个方法可以不用传递pk值,方法内会自动获取pk值
get_serializer()方法:指定序列化器类
filter_queryset()方法过滤查询集,把get_queryset()的查询集对象放到这里方法里面进行过滤,根据前端传递的过滤条件进行
分页
全局配置setting中指定分页引擎
# DEFAULT_PAGINATION_CLASS:全局指定分页引擎类
'DEFAULT_PAGINATION_CLASS': 'utils.pagination.ManualPageNumberPagination',
# 指定分页引擎类后,一定要指定每一页获取的条数
'PAGE_SIZE': 3
paginate_queryset()方法:分页方法,传入查询集,page为分页之后的查询集对象,需要返回get_paginated_responseget_paginated_response会提供总的条数,下一页的链接,上一页的链接,当前页的数据
page = self.paginate_queryset(project_qs) if page is not None: serializer = self.get_serializer(instance=page, many=True) return self.get_paginated_response(serializer.data)
PageNumberPagination类
可以用来自定义一些分页的参数
# 修改父类PageNumberPagination里的分页,修改完放在全局配置表中 class ManualPageNumberPagination(PageNumberPagination): # 前端用户指定的页码key的名称,原来是page,现在是p page_query_param = 'p' # 前端用户指定的每一页条数key的名称 page_size_query_param = 's' # 前端能指定的每一页数据条数(当前不超过100条) max_page_size = 100 # 指定默认每一页两条数据,会覆盖全局配置中的条数 page_size = 2
浙公网安备 33010602011771号