django-restframwork filter查询源码分析

视图类继承了ListModelMixin类

class ListModelMixin(object):
    """
    List a queryset.
    """
    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)

当请求过来时,先走get_queryset()方法,得到一个queryset对象,再将这个对象传入到filter_querysete方法中进行过滤。其运行流程如下(如果视图类中没有写filter_queryset方法则去

GenericAPIView中找

)

 如图所示:先for循环filter_backends中的类。然后加括号实例化,再调用过滤类中的filter_queryset方法。

 再过滤类中,调用自己的get_filter_class(view,queryset,view)

再get_filter_class方法中,首先判断有没有filter_class类,和filter_fields字段。如果有,则运行对应代码,否则,返回None

原文地址:https://www.cnblogs.com/ltyc/p/15017453.html