一、过滤类和排序类源码分析
# 我们之前在学习排序和过滤类的时候是在继承了GenericAPIView+ListModelMixin的视图类中才能够配置的 # 然后在视图类中的filter_backends属性中上写排序类和过滤类就能够实现 # 可以配置在这个属性的有: -drf内置的过滤类(SearchFilter),排序类(OrderingFiler) -第三方模块django-filter -自定义类:写一个类,继承BaseFilterBackend,重写filter_queryset,返回的qs对象,就是过滤或排序后的 # 然后只有获取全部才会涉及到排序 所以肯定会有list方法 所以我们可以去看一下ListModelMixin的源码 class ListModelMixin: def list(self, request, *args, **kwargs): 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) # 返回分页和排序过后的数据 # 然后filter_queryset在这个类中没有这个方法和视图类中我们也没有写这个方法,所以我们要去GenericAPIView类中找这个方法 然后看一下这个方法写了啥 def filter_queryset(self, queryset): for backend in list(self.filter_backends): # 从视图类中filter_backends一个一个循环出来赋值给backend queryset = backend().filter_queryset(self.request, queryset, self) # 然后这里又利用了递归函数 把数据给过滤和排序完 return queryset # 最后返回出去 # 我们可以看到在循环取值的时候 源码用了list强行把变成列表 这样就不会循环报错 class LoginView(GenericAPIView): filter_backends = BaseFilterView # 我们在配置的时候也可以不用加列表也不会报错 # 我们还可以在视图类中重写filter_queryset方法 这样也就有提供了另一种过滤方法和排序方法
标签:self,queryset,视图,filter,rabc,simplui,排序,类中,drf From: https://www.cnblogs.com/stephenwzh/p/16788249.html