zoukankan      html  css  js  c++  java
  • django Rest Framework----GenericAPIView 通用视图 GenericAPIView源码分析

    一、GenericAPIView

    GenericAPIView扩展了APIView,为标准列表和详细视图添加了常见的行为。

    提供的每个具体通用视图都是一个GenericAPIView或多个mixin类组合在一起而构建的。

    例如:

    BookView视图类继承自:

    ListModelMixin:用于显示所有图书

    CreateModelMixin:添加一本书

    GenricAPIView:继承自APIView,提供as_view()等,获取当前视图类中queryset和serializer_class ,用于给ListModelMixin和CreateModelMixin使用。

    class BookView(mixins.ListModelMixin,
                   mixins.CreateModelMixin,
                   generics.GenericAPIView):
    
        queryset = models.Book.objects.all()
        serializer_class = BookModelSerializer
    
        def get(self,request, *args, **kwargs):
            return self.list(request, *args, **kwargs)
    
        def post(self,request,*args,**kwargs):
           return self.create(request,*args,**kwargs)
    
    .......

    二、GenericAPIView做了哪些事

    1.获取queryset数据,用于所有后续的操作

    def get_queryset(self):
        # 断言,满足我的条件参会向下执行,否则不执行
        # 所以必须视图类必须提供一个queryset,例如BookView视图类中第一行
        assert self.queryset is not None, (
                "'%s' should either include a `queryset` attribute, "
                "or override the `get_queryset()` method."
                % self.__class__.__name__
        )
        # 获取当前类中的queryset
        queryset = self.queryset
        if isinstance(queryset, QuerySet):
            queryset = queryset.all()
        return queryset

    2. 获取当前类serializer_class  : 该用于验证和反序列化输入以及序列化输出的序列化程序类

    def get_serializer_class(self):
        #断言:必须满足条件才行
        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer_class()` method."
            % self.__class__.__name__
        )
        #返回当前实例对象的serializer_class
        return self.serializer_class

    3. lookup_field :用于执行各个模型实例的对象查找的模型字段。默认是'pk'。

    需要注意,使用超链接的API时,您需要确保双方的API意见串行类设置查找字段

    url(r'books/(?P<pk>d+)/$',views.BookDetailView.as_view({'get': 'retrieve','put':'update','delete':'destroy'})),

    4. 分页

    与列表视图一起使用时,以下属性用于控制分页。

    pagination_class :分页列表结果时应使用的分页类。默认值与DEFAULT_PAGINATION_CLASS设置值相同,即'rest_framework.pagination.PageNumberPagination'设置pagination_class=None将禁用此视图的分页。

    5.过滤

    filter_backends - 应该用于过滤查询集的过滤后端类列表。默认值与DEFAULT_FILTER_BACKENDS设置相同。

  • 相关阅读:
    006_02SQLite_OpenHelper
    006_01SQLite_demo
    005_01XML_Serilizer
    004_05PullParser
    004_04SharedPreferences
    004_02文件读写模式
    004_01获取SD容量
    003_01电话拨号器
    maven项目中的pom.xml
    ORACLE提示表名无效
  • 原文地址:https://www.cnblogs.com/weihengblog/p/9206353.html
Copyright © 2011-2022 走看看