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 之视图的更多相关文章

  1. Django的rest_framework的视图之基于通用类编写视图源码解析

    我们上一篇博客讲解了如何使用mixins类实现rest_framework的视图,但是其中有很多的冗余的代码,我们这边在来优化一下 1.queryset的视图函数 首先看下对queryset操作的视图 ...

  2. rest_framework中视图相关

    模型类的定义 # 定义图书模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20, verb ...

  3. Django的rest_framework的视图之基于ModelViewSet视图源码解析

    前言 今天一直在整理Django的rest_framework的序列化组件,前面一共写了2篇博客,前面的博客给的方案都是一个中间的状态的博客,其中有很多的冗余的代码,如果有朋友不清楚,可以先看下我前面 ...

  4. Django的rest_framework的视图之Mixin类编写视图源码解析

    Mixin类编写视图 我们这里用auther表来做演示,先为auther和autherdetail写2个url url(r'^autherdetail/(?P<id>\d+)', view ...

  5. rest_framework之视图

    写一个出版社的增删改查restful接口 models from django.db import models # Create your models here. from django.db i ...

  6. Rest_Framework的视图与路由

    视图与路由 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django ...

  7. rest_framework之视图及源码剖析

    最初形态(工作中可能会使用) 引子 Django的CBV我们应该都有所了解及使用,大体概括一下就是通过定义类并在类中定义get post put delete等对应于请求方法的方法,当请求来的时候会自 ...

  8. rest_framework的视图组件继承过哪些类?

  9. django rest_framework入门四-类视图APIView

    上节,我们使用函数视图,用了@api_view装饰器来修饰,这一节,我们介绍类视图APIView,显然,类视图更符合面向对象的原则. 1.使用类视图APIView重写API 类视图APIView,取代 ...

随机推荐

  1. Numpy float64和Python float是一样的

    >>> numpy.float64(5.9975).hex() # 函数用于将10进制整数转换成16进制,以字符串形式表示. '0x1.7fd70a3d70a3dp+2' >& ...

  2. 要学的javaee技术

    mybatis.hibernate.spirng MVC.freemarker.zookeeper.dubbo.quartz的技术框架:NoSQL技术ehcache.memcached.redis等: ...

  3. npm 发布一个全局的指令

    我们经常使用 npm i  -g  xxxx 安装完成一个包之后,就能直接使用对应的指令.例如安装  vue-cli 或者 express 等 那么下面我们自己做一个类似的效果: 首先要对 npm 发 ...

  4. 第四章 DOM节点操作

    1.什么是DOM:DOM(document object model)文档对象模型,把每一个元素看做是一个节点,然后对节点进行增删改查的操作 2.DOM的分类:(1)Core Dom:可以对html, ...

  5. MongoDB 知识点

    左边是mongodb查询语句,右边是sql语句.对照着用,挺方便. db.users.find() select * from users db.users.find({"age" ...

  6. Python 两个星号(**)的 参数

    将参数以字典的形式导入

  7. 颜色扩展类--ColorExtensions

    /// <summary> /// 颜色扩展类 /// </summary> public static class ColorExtensions { /// <sum ...

  8. ant_<target>标签含义与使用

    <target>标记目标 目标是一个或多个任务的集合,任务是一段可执行的代码:构建文件中包含一个项目,在项目内部声明了所有目标: <target name = "run&q ...

  9. urllib3

    urllib3是一个功能强大.条理清晰.用于http客户端的python库,相对于urllib它所有的特点如下: 线程安全 连接池 客户端SSL/TLS验证 使用多部分编码上传文件 Helpers用于 ...

  10. log4net架构、配置、使用

    架构说明 架构说明 上图是官方文档的提供的代码组织. Log4net的核心组件有: Logger, Appender, Filter, Layout, Object Render, Logger介绍 ...