四、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

 

posted @ 2020-10-22 20:19  SoleMemory  阅读(202)  评论(0)    收藏  举报