Django-DRF-视图的演变

 

版本一(基于类视图APIView类)

views.py:

APIView是继承的Django View视图的。

  1. 1 from .serializers import UserSerializers #导入当前目录配置好的序列化器
  2. 2 from .models import User #导入数据库
  3. 3 from rest_framework.views import APIView #导入APIView
  4. 4 from rest_framework.response import Response #该模块返回json数据
  5. 5 from rest_framework import status #内置状态码模块
  6. 6
  7. 7 class UserAPIView(APIView): #查看所有及添加数据视图
  8. 8 def get(self,request):
  9. 9 users = User.objects.all() #获取数据库里所有数据
  10. 10 ser = UserSerializers(instance=users,many=True) #进行序列化操作,指定更多集合对象
  11. 11 return Response(ser.data,status=200)#返回成功数据
  12. 12
  13. 13 def post(self,request): #添加数据
  14. 14 ser = UserSerializers(data=request.data)#接收前台传输数据
  15. 15 if ser.is_valid(): #判断书否合法raise_exception=True加次参数表示不合法抛出异常,默认false
  16. 16 ser.save() #保存
  17. 17 return Response(ser.data,status=200)
  18. 18 return Response(ser.errors) #返回错误信息
  19. 19
  20. 20 class UserSingleView(APIView): #单条查询,改,删除视图
  21. 21 def get(self,request,pk):
  22. 22 user = User.objects.get(id=pk) #查询单条集合对象
  23. 23 ser = UserSerializers(instance=user)#序列化数据
  24. 24 return Response(ser.data)
  25. 25
  26. 26 def put(self,request,pk): #修改
  27. 27 user = User.objects.get(pk=pk)
  28. 28 ser = UserSerializers(instance=user,data=request.data) #注意指定参数
  29. 29 if ser.is_valid():
  30. 30 ser.save()
  31. 31 return Response(ser.data,status=200)
  32. 32 return Response(ser.errors)
  33. 33
  34. 34 def delete(self,request,pk): #删除操作
  35. 35 User.objects.get(pk=pk).delete()
  36. 36 return Response(status=status.HTTP_200_OK)
  1. 代码说明:
  2. 1. 使用类视图,定义两个类并继承APIView类视图;
  3. 2. 在类视图里编写:增删改查方法,通过HttpResponse返回状态。

serializers.py

  1.  

from rest_framework import serializers #导入序列

from .models import User #导入表

  1. class UserSerializers(serializers.Serializer):#注意继承的类
  2. nick_name = serializers.CharField(max_length=20,required=True) #required=True设置必须验证
  3. gender = serializers.BooleanField(default=0,required=False)
  4. def create(self, validated_data): #创建数据的操作
  5. return User.objects.create(**validated_data)
  6.  
  7. def update(self, instance, validated_data):#修改数据的操作
         instance接收的是数据库查询的单个对象,validated_data为前端传输的数据

  8. instance.nick_name = validated_data.get('nick_name',instance.nick_name)
  9. instance.gender = validated_data.get('gender',instance.gender)
  10. instance.save()          #取出值每个字段进行保存
  11. return instance

版本二(使用混合 mixins)

继承generics和mixins里的方法,称之为“混合”

views.py:

  1. 1 from rest_framework import mixins, generics # 导入相应模块
  2. 2 # mixins就是一个类,只不过这个类里定义了很多操作数据的方法
  3. 3 from .serializers import UserModelSerializer
  4. 4 class UserGenericAPIview(generics.GenericAPIView,mixins.ListModelMixin,mixins.CreateModelMixin):
  5. 5 queryset = UserInfo.objects.all() # queryset指定集合数据是从哪个数据库来
  6. 6 serializer_class =UserModelSerializer # serializer_class配置序列化器类UserModelSerializer
  7. 7
  8. 8 # 调用mixins.ListModelMixin类的list()方法
  9. 9 def get(self,request):
  10. 10 return self.list(request)
  11. 11
  12. 12 # 调用mixins.CreateModelMixin类的create()方法
  13. 13 def post(self,request):
  14. 14 return self.create(request)
  15. 15
  16. 16 class UserGenericSingleView(generics.GenericAPIView,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin):
  17. 17 queryset = UserInfo.objects.all()
  18. 18 serializer_class = UserModelSerializer
  19. 19
  20. 20 # 调用mixins.RetrieveModelMixin类的retrieve()方法
  21. 21 def get(self,request,pk): #检索
  22. 22 return self.retrieve(request)
  23. 23
  24. 24 # 调用mixins.UpdateModelMixin类的update()方法
  25. 25 def put(self,request,pk): #修改
  26. 26 return self.update(request)
  27. 27
  28. 28 # 调用mixins.DestroyModelMixin类的destroy()方法
  29. 29 def delete(self,request,pk): #破坏
  30. 30 return self.destroy(request)
代码说明:
1. 为什么要继承mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin等这一堆方法呢?
答:比如我们自定义写了delete方法,而这个方法会自动、只能的去调用mixins.DestroyModelMixin这个类里面的动作。

serializers,py

  1. 1 from rest_framework import serializers
  2. 2 from .models import UserInfo
  3. 3
  4. 4 class UserModelSerializer(serializers.ModelSerializer):
  5. 5 class Meta:
  6. 6 #配置model为UserInfo
  7. 7 model = UserInfo
  8. 8 fields = "__all__" #fields配置要序列化的字段,"__all__"表示所有的字段都序列化

在上个版本中,queryset和serializer属性都是通过自己声明去使用的;

这个版本继承使用混合继承了generics,通过查看generics源码发现如下:

  1. class GenericAPIView(views.APIView):
  2. ···
  3. queryset = None
  4. serializer_class = None
  5. ···

版本三(使用混合高级版)

views.py:

  1. 1 from rest_framework import generics
  2. 2
  3. 3 class UserListAPIView(generics.ListCreateAPIView):
  4. 4 queryset = UserInfo.objects.all()
  5. 5 serializer_class = UserModelSerializer
  6. 6
  7. 7 class UserSingleView(generics.RetrieveUpdateDestroyAPIView):
  8. 8 queryset = UserInfo.objects.all()
  9. 9 serializer_class = UserModelSerializer

这几行代码搞定上面所有功能,只需要传入queryset和serializer即可,这什么原理呢?

1、第二版本中,我们继承了generics.GenericAPIView类视图,自己写了两个get和post方法对吧,那generics的另一个方法把这两个事情也干了,我们只需要继承即可。
2、对的,这个方法就是generics.ListCreateAPIView,我们且看看它的源码,你就明白了
  1. class ListCreateAPIView(mixins.ListModelMixin,
  2. mixins.CreateModelMixin,
  3. GenericAPIView):
  4. """
  5. Concrete view for listing a queryset or creating a model instance.
  6. """
  7. def get(self, request, *args, **kwargs):
  8. return self.list(request, *args, **kwargs)
  9.  
  10. def post(self, request, *args, **kwargs):
  11. return self.create(request, *args, **kwargs)

版本四(视图集 ViewSet)

views.py:

  1. 1 from rest_framework import viewsets,mixins
  2. 2 class GennericViewsSet(viewsets.GenericViewSet,
  3. 3 mixins.CreateModelMixin,
  4. 4 mixins.ListModelMixin,
  5. 5 mixins.RetrieveModelMixin,
  6. 6 mixins.UpdateModelMixin,
  7. 7 mixins.DestroyModelMixin
  8. 8 ):
  9. 9 queryset = UserInfo.objects.all()
  10. 10 serializer_class = Userserializer

这个版本views里就写了一个类视图,之前的所有版本都是写一个List和一个Detail视图的,

这个类 继承了viewsets.GenericViewSet,其他的方法都是mixins的viewsets

GenericViewSet继承了ViewSetMixin方法,从ViewSetMixin的源码里能看到可以改写as_view的信息,来达到定制路由的效果

  1. class ViewSetMixin(object):
  2. @classonlymethod
  3. def as_view(cls, actions=None, **initkwargs):
  4. ······
  5. if not actions:
  6. raise TypeError("The `actions` argument must be provided when "
  7. "calling `.as_view()` on a ViewSet. For example "
  8. "`.as_view({'get': 'list'})`")

urls.py:

  1. 1 from django.conf.urls import url
  2. 2 from . import views
  3. 3
  4. 4 urlpatterns = [
  5. 5 url(r'^$',views.GennericViewsSet.as_view({'get':'list',"post": "create"})), #注意这里的写法
  6. 6 url(r'^users/(?P<pk>\d+)/$',views.GennericViewsSet.as_view({'get':'retrieve','put':'update','delete':'destroy'}))
  7. 7 ]

版本五 (终极大法:写项目选用此法)

views.py:

  1. 1 from rest_framework.viewsets import ModelViewSet
  2. 2 class ZhongJiBanView(ModelViewSet):
  3. 3 queryset = UserInfo.objects.all()
  4. 4 serializer_class = UserModelSerializer

直接继承了一个巨无霸(ModelViewSet),这个巨无霸将所有的功能都封装到一块。相当于把我们从第一版到第三版写的所有事情都干了,

按照老规矩,我们来看看它的源码:

  1. class ModelViewSet(mixins.CreateModelMixin,
  2. mixins.RetrieveModelMixin,
  3. mixins.UpdateModelMixin,
  4. mixins.DestroyModelMixin,
  5. mixins.ListModelMixin,
  6. GenericViewSet):
  7. """
  8. A viewset that provides default `create()`, `retrieve()`, `update()`,
  9. `partial_update()`, `destroy()` and `list()` actions.
  10. """
  11. pass

从源码中能看出,ModelViewSet所继承的视图类

urls.py

  1. 1 from . import views
  2. 2 from rest_framework.routers import DefaultRouter
  3. 3 rount = DefaultRouter()
  4. 4 rount.register('user',views.ZhongjiBanView)
  5. 5 urlpatterns = []
  6. 6 urlpatterns += rount.urls

最终版的规则使用了drf的DefaultRouter函数,通过实例化DefaultRouter得到route对象,使用route.register()你的app路由,有多个注册多个即可

Django REST framework 五种增删改查方法的更多相关文章

  1. entity framework 新手入门篇(2)-entity framework基本的增删改查

    经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...

  2. Django 自带的ORM增删改查

     通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...

  3. XML(五)dom4j增删改查

    book2.xml <? xml version="1.0" encoding="UTF-8"?> <书架> <书> < ...

  4. Spring Data CrudRepository增删改查方法(八)

    CrudRepository   的主要方法 long count(); boolean exists(Integer arg0); <S extends StudentPO> S sav ...

  5. 通用mapper的增删改查方法 留存 备忘

    Mybatis通用Mapper介绍与使用   前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQ ...

  6. Django之model基础(增删改查)

    一.ORM 映射关系 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象二.创建表(建立模型) 在创建表之前的准备 ...

  7. Django中多表的增删改查操作及聚合查询、F、Q查询

    一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...

  8. Django 文件配置、pycharm及django连接数据库、表的增删改查 总结

    静态文件配置 1.你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的 2.django如何给用户开设资源接口呢? ...

  9. ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查

    身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了.我们来看看在Core里面如何配置: 首先需要NuGet安装一个包:Microsoft.AspNetCore.Authent ...

随机推荐

  1. Tinghua Data Mining 9

    关联规则,营销购物 空缺 协同过滤

  2. Redis安装(centOS7)

    1.安装gcc环境 sudo yum install gcc-c++ 2.安装wget sudo yum install wget 3.下载Redis源码包 wget http://download. ...

  3. Influxdb 时序数据库 windows 安装

    Influxdb 是一款比较火爆的时序数据库,本文介绍如何在 windows 平台下安装. 1.场景: windows 平台的 influxdb 似乎只支持单机非windows 服务的安装方式 适用于 ...

  4. [未读]angularjs权威教程

    正在啃,赶脚不错...

  5. mac Latex dvipdfm 缺少字体错误 Failed to read UCS2/UCS4 TrueType cmap

    dvipdfmx 命令产生 ** ERROR ** Failed to read UCS2/UCS4 TrueType cmap... 错误的原因是没有把 simsun.ttf simkai.ttf ...

  6. WCF中的AsyncPattern

    WCF中的AsyncPattern   (系列博文源自 http://pfelix.wordpress.com/,由笔者翻译并整理,转载请注明) 在wcf 的 service contract中, 服 ...

  7. (C#)asp_net调试错误解决方法收集(1)

    (C#)asp_net调试错误解决方法收集(1) 2007-11-2309:20 一.异常详细信息:System.InvalidOperationException:对于不返回任何键列信息的Selec ...

  8. Django数据库创建与查询及ORM的概念

    ORM:是封装在pymysql上层的文件.他的作用是把python语句转换成sql语句,从而去数据库里操作数据.从数据库里获得的数据,经过orm转换为对象,对象可以直接调用属性获得值.orm本质是个中 ...

  9. poj2823滑动窗口

    这个是单调队列的入门题目.值得注意的一点是队列中的数的index是单调递增的,所以从队首删除的时候从前向后循环找到第一个index满足>= i - k + 1条件的元素作为队首元素就可以了,这也 ...

  10. 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承

    ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...