排序和过滤源码分析
排序和过滤源码分析
继承了GenericAPIView+ListModelMixin,只要在视图类中配置filter_backends它就能实现过滤和排序
源码分析前的引入
drf的过滤类、排序类
1.内置的
过滤类:SearchFilter
排序类:OrderingFilter
2.django-filter
3.自定义:写一个类,继承BaseFilterBackend,重写filter_queryset,返回的qs对象,就是过滤或排序后的
只有获取所有数据才涉及到排序
def list(self, request, *args, **kwargs):
# self.get_queryset()所有数据,经过了self.filter_queryset返回了qs
# self.filter_queryset完成的过滤
queryset = self.filter_queryset(self.get_queryset())
# 如果有分页,走的分页---->视图类中配置了分页类
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
# 如果没有分页,走正常的序列化,返回
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
源码分析
self.filter_queryset完成了过滤,当前在视图类中,self是视图类的对象,去视图类中找没找到,去父类--->GenericAPIView--->filter_queryset
def filter_queryset(self, queryset):
for backend in list(self.filter_backends):
queryset = backend().filter_queryset(self.request, queryset, self)
return queryset
"""
总结:
写的过滤类要重写filter_queryset,返回query_set(过滤或排序后)对象
后期如果不写过滤类,只要在视图类中重写filter_queryset,在里面实现过滤也可以
"""