Django REST framework 五种增删改查方法
Django-DRF-视图的演变
版本一(基于类视图APIView类)
views.py:
APIView是继承的Django View视图的。

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

serializers.py

from rest_framework import serializers #导入序列
from .models import User #导入表
- class UserSerializers(serializers.Serializer):#注意继承的类
- nick_name = serializers.CharField(max_length=20,required=True) #required=True设置必须验证
- gender = serializers.BooleanField(default=0,required=False)
- def create(self, validated_data): #创建数据的操作
- return User.objects.create(**validated_data)
- def update(self, instance, validated_data):#修改数据的操作
instance接收的是数据库查询的单个对象,validated_data为前端传输的数据- instance.nick_name = validated_data.get('nick_name',instance.nick_name)
- instance.gender = validated_data.get('gender',instance.gender)
- instance.save() #取出值每个字段进行保存
- return instance

版本二(使用混合 mixins)
继承generics和mixins里的方法,称之为“混合”
views.py:

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

serializers,py

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

在上个版本中,queryset和serializer属性都是通过自己声明去使用的;
这个版本继承使用混合继承了generics,通过查看generics源码发现如下:
- class GenericAPIView(views.APIView):
- ···
- queryset = None
- serializer_class = None
- ···
版本三(使用混合高级版)
views.py:

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

这几行代码搞定上面所有功能,只需要传入queryset和serializer即可,这什么原理呢?
2、对的,这个方法就是generics.ListCreateAPIView,我们且看看它的源码,你就明白了

- class ListCreateAPIView(mixins.ListModelMixin,
- mixins.CreateModelMixin,
- GenericAPIView):
- """
- Concrete view for listing a queryset or creating a model instance.
- """
- def get(self, request, *args, **kwargs):
- return self.list(request, *args, **kwargs)
- def post(self, request, *args, **kwargs):
- return self.create(request, *args, **kwargs)

版本四(视图集 ViewSet)
views.py:

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

这个版本views里就写了一个类视图,之前的所有版本都是写一个List和一个Detail视图的,
这个类 继承了viewsets.GenericViewSet,其他的方法都是mixins的viewsets
GenericViewSet继承了ViewSetMixin方法,从ViewSetMixin的源码里能看到可以改写as_view的信息,来达到定制路由的效果

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

urls.py:

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

版本五 (终极大法:写项目选用此法)
views.py:
- 1 from rest_framework.viewsets import ModelViewSet
- 2 class ZhongJiBanView(ModelViewSet):
- 3 queryset = UserInfo.objects.all()
- 4 serializer_class = UserModelSerializer
直接继承了一个巨无霸(ModelViewSet),这个巨无霸将所有的功能都封装到一块。相当于把我们从第一版到第三版写的所有事情都干了,
按照老规矩,我们来看看它的源码:

- class ModelViewSet(mixins.CreateModelMixin,
- mixins.RetrieveModelMixin,
- mixins.UpdateModelMixin,
- mixins.DestroyModelMixin,
- mixins.ListModelMixin,
- GenericViewSet):
- """
- A viewset that provides default `create()`, `retrieve()`, `update()`,
- `partial_update()`, `destroy()` and `list()` actions.
- """
- pass

从源码中能看出,ModelViewSet所继承的视图类
urls.py
- 1 from . import views
- 2 from rest_framework.routers import DefaultRouter
- 3 rount = DefaultRouter()
- 4 rount.register('user',views.ZhongjiBanView)
- 5 urlpatterns = []
- 6 urlpatterns += rount.urls
最终版的规则使用了drf的DefaultRouter函数,通过实例化DefaultRouter得到route对象,使用route.register()你的app路由,有多个注册多个即可
Django REST framework 五种增删改查方法的更多相关文章
- entity framework 新手入门篇(2)-entity framework基本的增删改查
经过前两节的简单描述,终于可以进入entity framework的使用部分了.本节将对entity framework原生的增删改查进行讲解. 承接上面的部分,我们有一个叫做House的数据库,其中 ...
- Django 自带的ORM增删改查
通过Django来对数据库进行增删改查 1 首先创建类,在app应用程序里面的model模块里面创建类,写好数据库信息,方便我们待会初始化: 2 创建在django项目里面的settings里面添加 ...
- XML(五)dom4j增删改查
book2.xml <? xml version="1.0" encoding="UTF-8"?> <书架> <书> < ...
- Spring Data CrudRepository增删改查方法(八)
CrudRepository 的主要方法 long count(); boolean exists(Integer arg0); <S extends StudentPO> S sav ...
- 通用mapper的增删改查方法 留存 备忘
Mybatis通用Mapper介绍与使用 前言 使用Mybatis的开发者,大多数都会遇到一个问题,就是要写大量的SQL在xml文件中,除了特殊的业务逻辑SQL之外,还有大量结构类似的增删改查SQ ...
- Django之model基础(增删改查)
一.ORM 映射关系 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象二.创建表(建立模型) 在创建表之前的准备 ...
- Django中多表的增删改查操作及聚合查询、F、Q查询
一.创建表 创建四个表:书籍,出版社,作者,作者详细信息 四个表之间关系:书籍和作者多对多,作者和作者详细信息一对一,出版社和书籍一对多 创建一对一的关系:OneToOne("要绑定关系的表 ...
- Django 文件配置、pycharm及django连接数据库、表的增删改查 总结
静态文件配置 1.你在浏览器中输入网址能够有响应的资源返回给你 是因为后端已经提前给你开设该资源的接口,也就意味着你所能 访问到的资源 都是人家事先定义好的 2.django如何给用户开设资源接口呢? ...
- ASP.NET CORE系列【三】使用Entity Framework Core进行增删改查
身份验证 以前我们熟悉的web.config中配置的form验证,现在没有了.我们来看看在Core里面如何配置: 首先需要NuGet安装一个包:Microsoft.AspNetCore.Authent ...
随机推荐
- Tinghua Data Mining 9
关联规则,营销购物 空缺 协同过滤
- Redis安装(centOS7)
1.安装gcc环境 sudo yum install gcc-c++ 2.安装wget sudo yum install wget 3.下载Redis源码包 wget http://download. ...
- Influxdb 时序数据库 windows 安装
Influxdb 是一款比较火爆的时序数据库,本文介绍如何在 windows 平台下安装. 1.场景: windows 平台的 influxdb 似乎只支持单机非windows 服务的安装方式 适用于 ...
- [未读]angularjs权威教程
正在啃,赶脚不错...
- mac Latex dvipdfm 缺少字体错误 Failed to read UCS2/UCS4 TrueType cmap
dvipdfmx 命令产生 ** ERROR ** Failed to read UCS2/UCS4 TrueType cmap... 错误的原因是没有把 simsun.ttf simkai.ttf ...
- WCF中的AsyncPattern
WCF中的AsyncPattern (系列博文源自 http://pfelix.wordpress.com/,由笔者翻译并整理,转载请注明) 在wcf 的 service contract中, 服 ...
- (C#)asp_net调试错误解决方法收集(1)
(C#)asp_net调试错误解决方法收集(1) 2007-11-2309:20 一.异常详细信息:System.InvalidOperationException:对于不返回任何键列信息的Selec ...
- Django数据库创建与查询及ORM的概念
ORM:是封装在pymysql上层的文件.他的作用是把python语句转换成sql语句,从而去数据库里操作数据.从数据库里获得的数据,经过orm转换为对象,对象可以直接调用属性获得值.orm本质是个中 ...
- poj2823滑动窗口
这个是单调队列的入门题目.值得注意的一点是队列中的数的index是单调递增的,所以从队首删除的时候从前向后循环找到第一个index满足>= i - k + 1条件的元素作为队首元素就可以了,这也 ...
- 【学习笔记】六:面向对象的程序设计——理解JS中的对象属性、创建对象、JS中的继承
ES中没有类的概念,这也使其对象和其他语言中的对象有所不同,ES中定义对象为:“无序属性的集合,其属性包含基本值.对象或者函数”.现在常用的创建单个对象的方法为对象字面量形式.在常见多个对象时,使用工 ...