rest_framework 之视图
1. 继承ModelSerilizer,直接指定要序列化的表模型 MySerializers.py
from app import models # 继承ModelSerilizer,直接指定要序列化的表模型
class BookSerializer(serializers.ModelSerializer): class Meta: # 内部类
# 指定要序列化book表
model = models.Book # 序列化所有的字段
fields = '__all__' #---------------------------------------------------------------- #局部钩子校验, 只要是Book 的字段均可以进行局部校验
def validate_name(self,value): # value 就是name字段的值
if value.startswith('sb'):
raise ValidationError('书名不能以sb开头!')
else:
return value #全局钩子校验
def validate(self,attrs): # 所有的都传过来
# OrderedDict([('name', 'php'), ('price', Decimal('33.00')), ('publish_date', datetime.date(2019, 3, 18)),
# ('publish', < Publish: 北京出版社 >), ('author', [ < Author: liu >])])
print(attrs) #是一个字典, 是所有属性的键值对 return attrs
第一层封装:
class BooksView(APIView):
'''
book_ser 的data 属性就是 字典
book_ser = BookSerializer(book_list,many=True)
response['data']= book_ser.data # 这里就是将book_list 对象转化成为字典 book_ser.data book_ser = BookSerializer(data=request.data) # 这里是将request.data 字典转换为对象,对象可以存进数据库
book_ser.save()
返回给前台的data 仍然是字典 即,book_ser 的data book_ser.errors 专门用来放错误信息
''' def get(self,request,*args,**kwargs):
book_list = Book.objects.all() # queryset对象,序列化称为列表
response = {'status':100,'msg':'查询成功'}
# 使用BookSerializer, 将对象转化成为字典
book_ser = BookSerializer(book_list,many=True)
print(book_ser)
print(book_ser.data)
response['data']= book_ser.data
return Response(response) def post(self,request):
# 新增图书
# 将data取出,反序列化成对象,然后将对象存入数据库,然后前台返回字典信息 book_ser.data
# 注意添加book 的时候一定选择JSON
response = {'status':100,'msg':'插入成功'}
print(request.data)
try:
# 将字典反序列化为对象
book_ser = BookSerializer(data=request.data)
if book_ser.is_valid():
book_ser.save()
response['data'] = book_ser.data
else:
response['msg'] = book_ser.errors
except Exception as e:
response['msg']=str(e)
return Response(response) class SingleBook(APIView):
# 获得单本图书, get,post 都要request参数
def get(self,request,id,*args, **kwargs):
response = {
'status':100,
'msg':'查询成功'
}
book = Book.objects.filter(pk=id).first()
book_ser = BookSerializer(instance=book,many=False)
response['data']=book_ser.data
return Response(response) def put(self,request,id):
# 修改图书,存入数据库的都是对象,所以要反序列化字典为对象
response = {
'status':100,
'msg': '修改成功!'
}
book = Book.objects.filter(pk=id).first()
try:
# 这里是修改,不是新增,因此要添加instance 这个字段, 注意这里不是query_set 对象
book_ser = BookSerializer(instance=book,data=request.data)
if book_ser.is_valid():
book_ser.save()
response['data']=book_ser.data
else:
response['data']=book_ser.errors
except Exception as e:
response['msg'] = str(e)
return Response(response) def delete(self,request,id):
# 删除返回的data 为空
response = {
'status':100,
'msg':'删除成功!',
'data':''
}
book = Book.objects.filter(pk=id).delete() # queryset对象
return Response(response)
第二层封装:
# 以上是对书的增删改查方法, 对作者,出版社同样可以增删改查
# 所以可以将增删改查方法提出来,然后进行调用就可以了
# 继承,封装 # 增删改查,每个方法封装一个类, 继承就可以获得相应的 get, put等方法
# drf 提供的 封装好的类
from rest_framework.mixins import ListModelMixin,RetrieveModelMixin,CreateModelMixin,DestroyModelMixin,UpdateModelMixin
from rest_framework.generics import GenericAPIView class BookView(ListModelMixin,CreateModelMixin,GenericAPIView):
'''
LsitModeMixin 中:
serializer = self.get_serializer(page, many=True) ----》 找不到get_serializer 方法
GenericAPIView : 有get_serializer 方法
返回 return serializer_class(*args, **kwargs), 就是book_ser = BookSerializer(book_list,many=True)
所以: serializer 就是 book_ser( 序列化后的JSON 数据)
serializer_class = BookSerializer
'''
serializer_class = BookSerializer
queryset = Book.objects.all() # 获得多个
def get(self,request,*args,**kwargs):
return self.list(request,*args,**kwargs)
# 新添
def post(self,request,*args,**kwargs):
return self.create(request,*args,**kwargs) class Single_book(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
'''
进入 RetrieveModelMixin: instance = self.get_object()
进入 GenericAPIView : get_object() 方法 ----》 get_queryset() ---》 queryset = queryset.all()
所以: 需要提供 queryset , 即 queryset = Book.objects.all()
'''
serializer_class = BookSerializer
queryset = Book.objects.all()
# 获取单条
def get(self,request,*args,**kwargs):
return self.retrieve(request,*args,**kwargs) def put(self,request,*args,**kwargs):
return self.update(request,*args,**kwargs) def delete(self,request,*args,**kwargs):
return self.destroy(request,*args,**kwargs)
第三层封装:
# 还可以继续封装, 将类中的方法 封装成一个
# 第三层: 使用rest_framework.generics import ListAPIView,ListCreateAPIView
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView # 包含两个方法 get and post
class BookView(ListCreateAPIView):
serializer_class = BookSerializer
queryset = Book.objects.all() # 包含三个方法, get,put,delete
class Single_book(RetrieveUpdateDestroyAPIView):
serializer_class = BookSerializer
queryset = Book.objects.all()
第四层封装:
# 第四层,可以将五个方法封装到一个类中
# 为了区分两个get 方法, 路由中的as_view() 方法要重写
# url(r'^book/$', views.BooksView.as_view({'get':'list','post':'create'})),
# url(r'^book/(?P<id>\w+)/$', views.SingleBook.as_view({'get':'retrive','put':'update','delete':'destroy'})), from rest_framework.viewsets import ModelViewSet
class BookView(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookSerializer
ViewSetMixin 的使用,重新了as_view 方法
# 经常用ViewSetMixin 只是重写了as_view() 方法
# as_view 就是将字典中的键值对应起来,所以值可以为任意自定义的函数 from rest_framework.viewsets import ViewSetMixin # 继承属性不能错!!!
class Publish(ViewSetMixin,APIView):
def aa(self,request):
return HttpResponse('aa')
# url(r'^book/$', views.BooksView.as_view({'get': 'aa'}) def get_all(self,request): # 就相当于之前定义的list 方法
pass #在路由中与之对应即可 def create(self,request):
pass
rest_framework 之视图的更多相关文章
- Django的rest_framework的视图之基于通用类编写视图源码解析
我们上一篇博客讲解了如何使用mixins类实现rest_framework的视图,但是其中有很多的冗余的代码,我们这边在来优化一下 1.queryset的视图函数 首先看下对queryset操作的视图 ...
- rest_framework中视图相关
模型类的定义 # 定义图书模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verb ...
- Django的rest_framework的视图之基于ModelViewSet视图源码解析
前言 今天一直在整理Django的rest_framework的序列化组件,前面一共写了2篇博客,前面的博客给的方案都是一个中间的状态的博客,其中有很多的冗余的代码,如果有朋友不清楚,可以先看下我前面 ...
- Django的rest_framework的视图之Mixin类编写视图源码解析
Mixin类编写视图 我们这里用auther表来做演示,先为auther和autherdetail写2个url url(r'^autherdetail/(?P<id>\d+)', view ...
- rest_framework之视图
写一个出版社的增删改查restful接口 models from django.db import models # Create your models here. from django.db i ...
- Rest_Framework的视图与路由
视图与路由 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django ...
- rest_framework之视图及源码剖析
最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...
- rest_framework的视图组件继承过哪些类?
- django rest_framework入门四-类视图APIView
上节,我们使用函数视图,用了@api_view装饰器来修饰,这一节,我们介绍类视图APIView,显然,类视图更符合面向对象的原则. 1.使用类视图APIView重写API 类视图APIView,取代 ...
随机推荐
- JMeter_方案上架,遇到的问题及解决
问题:手动输入时间接口正确,但是不会在前端展示 解决:发布时间.加入时间设置为服务器时间,服务器时间通过接口自动获取到
- 斐讯面试记录—TCP滑动窗口及拥塞控制
TCP协议作为一个可靠的面向流的传输协议,其可靠性是由流量控制和滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现. 一.滑动窗口协议 1. “窗口”对应的是一段可以被发送者发送的字节序 ...
- CentOS 7 使用OwnCloud建立私有云储存网盘
使用OwnCloud建立属于自己私有的云存储网盘 OwnCloud概述: OwnCloud 一款文件主机服务软件,就是我们平时使用的云存储,不过这是在自己主机的服务器上建立属于自己的私有云,OwnCl ...
- rocket mq知识点
1 消费类型 广播消费 : 一条消息被多个消费者消费 集群消费:一个 Consumer Group 中的 Consumer 实例平均分摊消费消息.例如某个 Topic 有 9 条消息,其中一个 Con ...
- Python- 解决PIP下载安装速度慢
让PIP源使用国内镜像,提升下载速度和安装成功率. 国外的源下载速度太慢,而且经常出现下载后安装出错问题.把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成功率. 国内源: 新版ub ...
- 基于Docker的GoldenGate部署
前言 Docker最近几年异常火爆,主要是因为其方便.快捷.轻量,相对于VM,它不需要占用太多资源,随时可以创建.删除,或在已有image上添加一些软件,再制作成另一个模板image供日后使用.Doc ...
- JZ2440使用笔记之熟悉uboot和Linux的移植
目录 一.点亮开发板:移植uboot.Linux内核.文件系统 1.1 配置上位机交叉编译环境 1.2 制作U-boot镜像文件 1.3 通过oflash.exe / openJTAG 烧写u-boo ...
- JSOIWC2019游记
世除我WC...都去广二了qaq,就我还在nj ycs至少也去了pkuwc啊 这个JSOIWC2019的内容看起来很水,进入条件简单,但窝啥都不会,肯定垫底 内容清单: 1.26 上午听机房dalao ...
- 牛客练习赛26—D xor序列 —线性基
这是我第一次写关于线性基的题目.其实这题很好理解,先把给出的数能异或出的值给存在p数组里面,p[i]代表着该异或出的数的最高位为第i位且为1. 求出来后,再把x,y处理下,然后直接一位一位的判断是否为 ...
- 【Luogu P2664】树上游戏
Problem Description \(lrb\) 有一棵树,树的每个节点有个颜色.给一个长度为 \(n\) 的颜色序列,定义 \(s(i,j)\) 为 \(i\) 到 \(j\) 的颜色数量.以 ...