排序和过滤源码分析

排序和过滤源码分析

继承了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,在里面实现过滤也可以
"""
posted @ 2022-10-13 18:22  张张包~  阅读(64)  评论(0编辑  收藏  举报