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,取代 ...
随机推荐
- [py]使用字典get方法做数据统计
s = "aabbccc" d = {} for i in s: if i in d: d[i] += 1 else: d[i] = 0 for i in s: d[i] = d. ...
- 猪年设计素材:一波免费猪猪icon已为你备好
马上就要步入猪年,设计圈里又要出现一波可爱的猪猪崽.快来收藏一波吧~ 先来看看下面几只尝尝鲜吧!墨刀准备了141个svg格式的猪猪icon,拉到文末免费获取哦! 猪年日历 (2019 Pig Cale ...
- 免费的文件比较工具和beyondcomare和source insight的比较工具
Linux下,meld就够了,命令行用用diff也行,kdiff3也不错. 参考 http://www.cnblogs.com/itech/archive/2009/08/13/1545344.htm ...
- 32位ubuntu16.4编译android4.1.1
安装所需库 sudo apt-get install build-essential sudo apt-get install make sudo apt-get install gcc sudo a ...
- 在 .Net Core1.0 上使用Mysql 的EFcore
https://www.codeproject.com/Articles/1218348/Using-EF-Core-with-MySQL-in-DotNet-Core
- 微信小程序scroll-view不能实现下拉刷新
一般在列表展示页面,会使用到上拉加载和下拉刷新功能,在scroll-view中有bindscrolltolower事件,可以实现上拉加载功能,但是却没法实现下拉刷新. 如需同时使用两种功能,解决步骤如 ...
- 数据库SQL的分组函数
分组函数:(五个) 1···max(expr):求expr的最大值 }\ 2···min(expr):求expr的最小值 }-- 数据类型是有规定的 3···sum(expr):求expr的总和 }- ...
- uvm设计分析——reg
项目中的reg_model一般只有一份,set到reg_sequence上,所以多个sequence并行启动结束的时候,reg model会成为一个共享资源. uvm_reg_field中的volat ...
- CSS——对position定位和margin-top的理解
一.常见定位方式 1.positon:absolute (脱离文档流) 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位 (这里的父元素是指定位方式为relative和abso ...
- 忘记mysql密码时对密码进行更改
第一步: 打开cmd 输入:net stop mysql 第二步: 再打开另一个cmd 输入:mysqld --skip-grant-tables 第三步: 打开第三个cmd ...