您的位置:首页 > 编程语言 > Python开发

python:django 框架一,二,三级视图函数示例

2019-03-14 15:18 405 查看

django 框架一,二,三级视图函数示例笔记

因常用到二级,三级视图函数,做个示例,视图集由于高度封装,有空的话另外再写一篇示例。

1,一级视图函数(APIView)

  • 1、继承自View, apiView属于rest_framework中的类

  • 2、扩展了,自己的request

    APIView中的request对象:
    获取数据GET: request.query_params
    获取数据POST: request.data (不管是表单还是json)
  • 获取GET数据: request.GET
    获取POST表单数据: request.POST
    获取POST,json数据: request.body
  • 3、扩展了,自己的response

      a. 可以自动根据前端的Accept类型,返回不同的数据
    • b. 可以设置常量类型的状态码,可以通过单词的含义来设置
  • 4、 封装和添加了,认证,权限,用户管理等功能

  • 5、API代码实现列表图(继承APIView)

  • from rest_framework.views import APIView
    get 获取所有的数据
    from .serializers import XXXInfoModelSerializer
    class XXXAPIView(APIView): # 类名大概取的,下面的同样
    def get(self,request):
    """获取所有的数据:"""
    # 1, 查询数据库
    XXX = XXXInfo.objects.all() # XXXInfo为表的模型类名,下面的同样
    # 2, 将数据转成字典
    serializer =  XXXInfoModelSerializer(instance=XXX,many=True)
    # 3, 返回响应
    return Response(serializer.data)
    
    post 新增一个对象数据
    def post(self,request):
    # 新增一本图书
    # 1,获取数据
    dic_data =  request.data
    # 2,创建书籍
    serializer =  XXXInfoModelSerializer(data=dic_data)
    serializer.is_valid(raise_exception=True)
    # 3,数据入库
    serializer.save()
    # 4,转成字典返回响应
    return Response(serializer.validated_data,status=status.HTTP_201_CREATED)
    
    class XXXDetailAPIView(APIView):
    get 获取指定的一个数据
    def get(self,request,pk):
    """获取一本图书"""
    # 1,根据pk参数,查询书籍
    XXX = XXXInfo.objects.get(id=pk)
    # 2,对象转字典
    serializer = XXXInfoModelSerializer(instance=book)
    # 3,返回响应
    return Response(serializer.data)
    
    put 修改指定的数据
    def put(self,request,pk):
    #修改一本图书
    # 1,获取数据
    dict_data = request.data
    # 2,根据pk,查询书籍
    XXX = XXXInfo.objects.get(pk=pk)
    # 3,修改书籍(序列化器)
    serializer = BookInfoModelSerializer(instance=book,data=dict_data)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    # 4,转成字典,返回响应
    return Response(serializer.validated_data)
    
    delete 删除指定的数据
    def delete(self,request,pk):
    #1,获取数据
    book = XXXInfo.objects.get(pk=pk)
    #2,删除数据
    XXX.delete()
    #3,返回响应
    return Response(status=status.HTTP_204_NO_CONTENT)

    2,二级视图函数(GenericAPIView)

    • 作用:提供序列化器,查询集
    GenericAPIView特点:
    1, GenericAPIView继承了APIView类,为列表视图, 详情视图添加了常用的方法和属性。
    属性:
    serializer_class: 给视图提供了通用的序列化器类
    queryset:         表示查询的数据集(结果集),一般写成所有的结果集(给列表视图,详情视图使用)
    lookup_field:     默认的查询方式为pk, 如果不想要,可以重写
    
    方法:
    get_queryset: 获取了,属性queryset的值
    serializer_class: 获取序列化器类,就是上面的属性serializer_class
    get_serializer: 获取的是序列化器的,实例对象
    get_object:     根据pk,获取了数据集中的单个对象
    
    2, GenericAPIView与一个或多个mixin类组合而构建的
    作用: 已经提供好了,对应的业务处理功能(list,create,retrieve,update,destroy方法)
    
    mixin名称                 提供方法            作用
    ListModelMixin           list               获取所有数据
    CreateModelMixin         create             创建数据
    RetrieveModelMixin       retrieve           获取单个数据
    UpdateModelMixin         update             跟新数据
    DestroyModelMixin        destroy            删除单个数据
    • GenericAPIView和MiXin配合使用,代码示例(继承GenericAPIView)
    from rest_framework.generics import GenericAPIView
    (1),get 获取所有数据
    class XXXInfoGenericAPIView(GenericAPIView):
    #1,给当前视图,提供了,通过的序列化器类
    serializer_class = XXXInfoModelSerializer
    #2,给当前的视图,提供了,通用的数据集(结果集)
    queryset = XXXInfo.objects.all()
    
    def get(self,reqeust):
    """获取所有数据"""
    #1,查询所有结果, 以下三句话等价
    # XXX = XXXInfo.objects.all()
    # XXX = self.queryset
    XXX = self.get_queryset()
    
    #2,定义序列化器,以下三句话等价
    # serializer = XXXInfoModelSerializer(instance=XXX,many=True)
    # serializer = self.serializer_class(instance=XXX,many=True)
    serializer = self.get_serializer(instance=XXX,many=True)
    
    #3,返回
    return Response(serializer.data)
    
    (2),get 获取指定单个数据
    def get(self,request,pk):
    #1,获取单个数据
    # XXX = XXXInfo.objects.get(pk=pk)
    XXX = self.get_object()
    
    #2,定义序列化器
    serializer = self.get_serializer(instance=book)
    
    #3,返回
    return Response(serializer.data)
    (3),put 修改指定的单个数据
    def put(self,request,pk):
    #1,获取数据,书籍对象
    dict_data = request.data
    book = self.get_object()
    
    #2,获取序列化器对象
    serializer = self.get_serializer(instance=book,data=dict_data)
    
    #3,校验,入库
    serializer.is_valid(raise_exception=True)
    serializer.save()
    
    #4,返回
    return Response(serializer.validated_data)
    (4),delete 删除指定单个数据
    def delete(self,request,pk):
    XXX = self.get_object()
    XXX.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

    三、三级视图函数

    作用: 封装get,post方法,继承GenericAPIView和mixin

    三级视图:
    1, 继承自了,GenericAPIView,和mixin
    2, 不同的三级视图提供了不同的功能
    
    三级视图名称         父类                                 提供方法        作用
    ListAPIView       GenericAPIView,ListModelMixin        get          获取所有数据
    CreateAPIView     GenericAPIView,CreateModelMixin      post         新建单个数据
    RetrieveAPIView   GenericAPIView,RetrieveModelMixin    get          获取单个数据
    UpdateAPIView     GenericAPIView,UpdateModelMixin      put          跟新数据
    DestroyAPIView    GenericAPIView,DestroyModelMixin     delete       删除单个数据
    • 代码示例
    from rest_framework.mixins import ListModelMixin,CreateModelMixin
    class XXXInfoMiXinGenericAPIView(ListModelMixin,CreateModelMixin,GenericAPIView):
    
    serializer_class = XXXInfoModelSerializer
    queryset = BookInfo.objects.all()
    
    def get(self,request):
    """获取所有书籍"""
    return self.list(request)
    
    def post(self,request):
    """创建单本书籍"""
    return self.create(request)
    
    from rest_framework.mixins import RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
    class XXXInfoDetailMiXinGenericAPIView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
    
    serializer_class = XXXInfoModelSerializer
    queryset = XXXInfo.objects.all()
    
    def get(self,request,pk):
    """获取单本书籍"""
    return self.retrieve(request)
    
    def put(self,request,pk):
    """跟新书籍"""
    return self.update(request)
    
    def delete(self,request,pk):
    """删除数据"""
    return self.destroy(request)
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: