1.View:Django默认的视图基类,Django的HttpRequeset对象
2.APIView:REST-framework提供的所有视图的基类,继承自Django的View
     REST framework的Request对象
Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。
serializer = BookSerializer(book,many=True)    序列化,获取字段
 serializer.data    获取序列化后的数据
 serializer = BookSerializer(data=data)    反序列化,传入字段
 serializer.is_valid(raise_exception=True)    校验并返回错误
3.GenericAPIView:继承自APIView,增加列表视图和详情视图的通用方法和属性
https://blog.csdn.net/qq_31742423/article/details/83241461
属性:提前将要调用的设置好,方法中直接调用就可以
 queryset 设置结果集      ~queryset = BookInfo.objects.all()
 serializer_class 设置序列化器    ~serializer_class = BookSerializer
 lookup_field 查询指定的对象,默认为'pk'    ~lookup_field = 'id'
方法:
 get_queryset(self) 返回视图使用的查询集    ~books = self.get_queryset()
 get_serializer(self,_args, *_kwargs) 返回序列化器对象    ~serializer = self.get_serializer(book)
 get_object(self) 返回详情视图所需的模型类数据对象    ~book = self.get_object()
 # ListModelMixin            列表,获取全部对象
 # CreateModelMixin          新增资源
 # RetrieveModelMixin        索引,获取一个资源
 # UpdateModelMixin             更新一个资源
 # DestoryModelMixin     损毁,删除一个资源
 调用的时候和GenericAPIView一样放在类的括号里,好像光放置首字母大写也可以
Patch 补丁,局部更新某一属性,user_name,Put方法的补充
 4.三级视图(对GenericAPIView和Mixin的直接封装)
 第3和4算是一种关系
mixins类,会返回不同的状态码
 CreateAPIView    创造
 ListAPIView    列表
 RetrieveAPIView    检索
 DestroyAPIView    损毁
 UpdateAPIView    更新
 ListCreateAPIView    列表创造
 RetrieveUpdateAPIView    检索更新
 RetrieveDestroyAPIView    检索删除
 RetrieveUpdateDestroyAPIView    检索更新删除
导入封装的模型,通过下面就可以更加简洁
 from rest_framework import mixins
 class ProjectsView(mixins.ListModelMixin,
                    mixins.CreateModelMixin,
                    mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    GenericAPIView):
     # 增加所需属性
     def get(self, request, *args, **kwargs):
         return self.list(request, *args, **kwargs)
     def post(self, request, *args, **kwargs):
         return self.create(request, *args, **kwargs)
5.ViewSet:继承自APIView
router = DefaultRouter()    创建默认的本机地址
 router.register(r'booklist',views.BookModelViewset)
 会生成两种url
 user/    列表
 user/3    详情
 urlpatterns +=  router.urls    将建立好的url放在地址列表中
 需要继承viewsets.ViewSet类
 类的函数不需要使用get\post\delete等,可以自建其他函数,然后在路由中转
 path('user/',view.MyViewSet.as_view({
     'get':'list',
 }))
 https://zhuanlan.zhihu.com/p/72527077
 序列化:将数据库的数据模型转化为前端所需要的格式(json等)
 反序列化:可以验证传入数据是否规范并保存
反序列化:拿到前端数据->序列化器的data->调用序列化器的is_vaid()方法
 校验->调用序列化器的.sava()方法保存
~~~url.py~~~
# viewsets
 # 封装drf路由
 from rest_framework.routers import DefaultRouter
 # 创建路由器
 router=DefaultRouter()
 # 注册路由
 router.register(r'user_model_view_set',views.UserModelViewSet)
 # 将生成好的路由放在原路由
 urlpatterns+=router.urls
 ~~~views.py~~~
# 这里使用的viewset
 from rest_framework import viewsets
 from rest1.serializers import UserModelViewSetSerializers
 # ViewSet
 class UserModelViewSet(viewsets.ModelViewSet):
     queryset = UserInfo.objects.all()
     serializer_class = UserModelViewSetSerializers
     lookup_field = 'id'
 ~~~serializers.py~~~
# ModelSerializer
 class UserModelViewSetSerializers(serializers.ModelSerializer):
     # 定义序列化器
     # class Meta做为嵌套类,主要目的是给上级类添加一些功能或者标准
     class Meta:
         # 指定序列化从那个模型映射字段
         model=UserInfo
         # 映射所有字段
         fields='__all__'
         # 填入指定字段
         # fields = ('user_name', 'password')
         # 除了这个字段
         # exclude = ('user_name',)
         # 含有外键的数据库,设置depth为整数,通常为1
  










