Day05-基础视频目录

  1. 序列化器Serializer-ModelSerializer序列化器类的使用

    from rest_framework import serializers
    
    serializers.ModelSerializer:
    	是Serializer类的子类,在定义序列化器类时,如果序列化器类针对的是某个模型类,可以直接继承于ModelSerializer。
    	好处:
    		1. 序列化器类字段可以依据模型类的字段自动生成
    		2. ModelSerializer里面已经实现create和update方法
    
  2. 类视图-APIView视图基类的功能&使用

    APIView视图基类:
    	Django框架View类的子类,在View类的基础上封装了一些功能。
    
    功能如下:
    	1. 视图request参数变成了Request类的对象,不再是Django原始HttpRequest类的对象;
    		request.data: 保存解析之后的请求体中数据,已经解析为了字典或类字典(QueryDict)。request.POST|request.body|request.FILES
    		request.query_params: 保存解析之后的查询字符串。request.GET
    		
    	2. 响应时可以统一返回Response类的对象,DRF框架会根据客户端请求头的`Accept`将响应数据转换为对应数据格式进行返回,默认返回json,仅支持html或json;
    		`Accept: text/html`:将响应数据转换为html进行返回
    		`Accept: applicaiton/json`:将响应数据转换为json进行返回
    		return Response(响应数据)
    	
    	3. 异常处理:如果视图出现了未处理的异常,DRF框架会对异常进行处理,并将处理的错误响应返回给客户端;
    	4. 认证&权限&限流
    
  3. 案例-继承APIView改写RestAPI接口

  4. 类视图-GenericAPIView视图基类的功能&使用

    GenericAPIView视图基类:
    	继承自APIView,在APIView类的基础上封装了一些功能。
    	
    功能如下:
    	1. 封装了操作序列化器的属性和方法:
    		属性:
    			serializer_class:指明视图所使用的序列化器类;
    		方法:
    			get_serializer_class:获取视图所使用的序列化器类;
    			get_serializer:创建一个视图所使用的序列化器类的对象;
    			
    		class 类视图(GenericAPIView):
    			serializer_class = <序列化器类>
    	
    	2. 封装了查询数据库的属性和方法:
    		属性:
    			queryset:指明视图所使用的查询集
    		方法:
    			get_queryset:获取视图所使用的查询集
    			get_object:从视图所使用的查询集中查询指定的对象(默认根据pk主键进行查询)
    			
    		class 类视图(GenericAPIView):
    			queryset = <查询集>
    			
    	3. 过滤&分页
    
  5. 类视图-GenericAPIView视图基类的源码说明

    补充说明:
    	定义类视图之后,类视图对象有一个属性kwargs:是一个字典,保存从url地址中提取的所有命名参数;
    
    	# /books/(?P<pk>\d+)/
    	class 类视图(View|APIView|GenericAPIView):
            def 方法(self):
                # self.kwargs['pk']
                
    		def get(self, request, pk):
    			"""
    			self.kwargs: 是一个字典,保存从url地址中提取的所有命名参数;
    			"""
                pass
    
  6. 类视图-Mixin扩展类的功能&使用

    继承自GenericAPIView之后,使用GenericAPIView中提供的操作序列化器的函数和数据库查询的函数写出的代码变成了通用代码,这些通用代码抽取之后,就是DRF框架提供的5个Mixin扩展类。
    
    Mixin扩展类:
    	ListModelMixin:list,封装了获取一组数据通用流程。
    	CreateModelMixin:create,封装了新增一条数据通用流程。
    	RetrieveModelMixin:retrieve,封装了获取指定数据通用流程。
    	UpdateModelMixin:update,封装了更新指定数据通用流程。
    	DestroyModelMixin:destroy,封装了删除指定数据通用流程。
    	
    GenericAPIView通常配合Mixin扩展类进行使用。
    
  7. 类视图-子类视图类的功能&使用说明

    9个子类视图类:
    	同时继承了GenericAPIView和对应Mixin扩展类,同时在子类视图中提供了对应的请求处理函数。
    	
    	from rest_framework import generics
    	
    	class ListAPIView(ListModelMixin, GenericAPIView):
    		def get(self, request, *args, **kwargs):
    			return self.list(request, *args, **kwargs)
    			
    	class CreateAPIView(CreateModelMixin, GenericAPIView):
    		def post(self, request, *args, **kwargs):
    			return self.create(request, *args, **kwargs)
    
  8. 视图集-ViewSet视图集的功能&使用

    视图集:将操作同一组资源的处理函数放在同一个类中,这个类就是视图集。
    
    视图集和类视图的区别?
    答:实现同一组接口时,如果使用类视图可能需要多个类视图,而使用视图集时只需要一个视图集。
    	比如:实现图书管理的5个接口时,使用类视图用了2个类视图:BookListVIew和BookDetailView,如果使用视图集只需要一个即可。
    	
    基本使用:
    	1. 继承自ViewSet(继承自ViewSetMixin和APIView)
    	2. 视图集中的处理函数不再以请求方式(比如:get,post等)命名,而是以对应的action操作命名,常见操作如下:
    		list:获取一组数据
    		create:创建一条数据
    		retrieve:获取指定数据
    		update:修改指定数据
    		destroy:删除指定数据
    	3. 在urls.py进行url地址配置时需要明确指明某种请求方式请求某个地址对应的是视图集中的哪个处理函数。
    
  9. 视图集-视图集父类GenericViewSet使用

    继承自ViewSetMixin和GenericAPIView,可以配合Mixin扩展类提供对应的处理函数
    
  10. 视图集-视图集父类ModelViewSet和ReadOnlyModelViewSet使用

    ModelViewSet:继承了5个Mixin扩展类,同时继承了GenericViewSet
    ReadOnlyModelViewSet:继承了ListModelMixin, RetireveModelMixin,同时继承了GenericViewSet
    
    需求:
    	写一个视图集,提供一下2个API接口:
    	1. 获取所有的图书 GET /books/ -> list
    	2. 获取指定的图书 GET /books/(?P<pk>\d+)/ -> retrieve
    	
    	class BookInfoViewSet(ReadOnlyModelViewSet):
    		queryset = BookInfo.objects.all()
    		serializer_class = BookInfoSerializer
    

    1)ModelSerializer

    ​ Serializer和ModelSerializer区别?

    ​ 答:ModelSerializer是Serializer类子类,如果序列化器类针对是某个模型类时,可以直接继承于ModelSerializer。

    ​ 好处:

    ​ 1. 字段自动生成

    ​ 2. create和update已经实现

    2)APIView视图基类

    ​ APIView和View区别?

    ​ 答:APIView是View子类。

    ​ 功能:

    1. request请求对象->Request

      request.data:保存解析之后的请求体数据。

      request.query_params:保存解析之后的查询字符串数据。

      1. 响应对象:返回Response

      return Response(响应数据)

      1. 异常处理

      2. 认证&权限&限流

    3)GenericAPIView视图基类

    ​ GenericAPIView和APIView区别?

    ​ 答:GenericAPIView是APIView类的子类,在APIView基础上封装操作序列化器和数据库查询的相关属性和方法。

    ​ 序列化操作:

    ​ 属性:serializer_class

    ​ 方法:

    ​ get_serializer_class

    ​ get_serializer

    ​ 数据库操作:

    ​ 属性:queryset

    ​ 方法:

    ​ get_queryset

    ​ get_object

    4)5个Mixin扩展类

    ​ Mixin扩展类需要配置GenericAPIView进行使用

    ​ ListModelMixin

    ​ CreateModelMixin

    ​ RetrieveModelMixin

    ​ UpdateModelMixin

    ​ DestroyModelMixin

​ 5)9个子类视图类

​ 继承GenericAPIVIew和对应的Mixin扩展,而且提供了对应的请求处理方法。

​ 6)视图集

​ 类视图和视图集区别?

​ 答:实现同一组接口时,如果使用类视图可能需要多个类视图,而使用视图集时只需要一个视图集。

# 需求1:写一个类视图,提供以下1个接口
	1. 获取所有的图书数据 get /books/
    # 1. APIView
    class BookListView(APIView):
        def get(self, request):
            books = BookInfo.objects.all()
            serializer = BookInfoSerializer(books, many=True)
            return Response(serializer.data)
        
   # 2. GenericAPIView
	class BookListView(GenericAPIView):
        # 指定视图所使用的序列化器类
        serializer_class = BookInfoSerializer
        # 指定视图所使用的查询集
        queryset = BookInfo.objects.all()
        
        def get(self, request):
            qs = self.get_queryset()
            serializer = self.get_serializer(qs, many=True)
            return Response(serializer.data)
   
   # 3. Mixin扩展类
   class ListModelMixin(object):
    	def list(self, request, *args, **kwargs):
            qs = self.get_queryset()
            serializer = self.get_serializer(qs, many=True)
            return Response(serializer.data)
        
   class BookListView(ListModelMixin, GenericAPIView):
        # 指定视图所使用的序列化器类
        serializer_class = BookInfoSerializer
        # 指定视图所使用的查询集
        queryset = BookInfo.objects.all()
        
        def get(self, request):
            return self.list(request)
   
	# 4. 子类视图:ListAPIView
    class ListAPIView(ListModelMixin, GenericAPIView):
        def get(self, request, *args, **kwargs):
            return self.list(request, *args, **kwrags)
        
    class BookListView(ListAPIView):
        # 指定视图所使用的序列化器类
        serializer_class = BookInfoSerializer
        # 指定视图所使用的查询集
        queryset = BookInfo.objects.all()
    
# 需求2:写一个类视图,提供以下2个接口
	1. 获取指定的图书数据 get /books/(?P<pk>\d+)/
    2. 修改指定的图书数据 put /books/(?P<pk>\d+)/
    
	# 1.  APIView
    class BookDetailView(APIView):
        def get(self, request, pk):
            try:
            	book = BookInfo.objects.get(pk=pk)
            except BookInfo.DoesNotExist:
                raise Http404
            
            serializer = BookInfoSerializer(book)
            return Response(serializer.data)
        
      	def put(self, request, pk):
            try:
            	book = BookInfo.objects.get(pk=pk)
            except BookInfo.DoesNotExist:
                raise Http404
            
            # 反序列化-数据校验
            serializer = BookInfoSerializer(book, data=request.data)
            serializer.is_valid(raise_exception=True)
            
            # 反序列化-数据保存(update)
            serializer.save()
            
            return Response(serializer.data)
        
    # 2. GenericAPIView
    class BookDetailView(GenericAPIView):
        serializer_class = BookInfoSerializer
        queryset = BookInfo.objects.all()
        
        def get(self, request, pk):
            book = self.get_object()
            
            serializer = self.get_serializer(book)
            return Response(serializer.data)
        
      	def put(self, request, pk):
            book = self.get_object()
            
            # 反序列化-数据校验
            serializer = self.get_serializer(book, data=request.data)
            serializer.is_valid(raise_exception=True)
            
            # 反序列化-数据保存(update)
            serializer.save()
            
            return Response(serializer.data)
        
    # 3. Mixin扩展类
    class BookDetailView(RetrieveModelMixin, UpdateModelMixin, GenericAPIView):
        serializer_class = BookInfoSerializer
        queryset = BookInfo.objects.all()
        
        def get(self, request, pk):
            return self.retrieve(request, pk)
        
      	def put(self, request, pk):
            return self.update(request, pk)
        
    # 4. 子类视图:RetrieveUpdateAPIView
    class BookDetailView(RetrieveUpdateAPIView):
        serializer_class = BookInfoSerializer
        queryset = BookInfo.objects.all()

APIView->GenericAPIView->Mixin扩展类->子类视图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值