序列化器代码

  1. # 声明序列化器from rest_framework import serializersfrom djangoDome.models import Book
  2.  
  3. class PublisherSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=32)
  4.  
  5. class AuthorSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField(max_length=32)
  6.  
  7. #自定义字段def my_validate(value): if 'xxoo' in value.lower(): #抛敏感词汇 raise serializers.ValidationError('敏感词汇') return value
  8.  
  9. # class BookSerializer(serializers.Serializer):# id = serializers.IntegerField(required=False)# title = serializers.CharField(max_length=32,)# 自定义的加这个参数 validators=[my_validate,]# pub_time = serializers.DateField()# category=serializers.CharField(source='get_category_display',read_only=True) #此处为多选时用# #read_only = True 正序查找# publisher=PublisherSerializer(read_only=True) #多对一# authors=AuthorSerializer(many=True,read_only=True) #多对多用 many=True## #write_only =True 反序查找 要重新定义# post_category = serializers.IntegerField(write_only=True)# publisher_id = serializers.IntegerField(write_only=True)# author_list = serializers.ListField(write_only=True)## #重写 create 方法# def create(self, validated_data):# #validated_data 校验通过的数据 就是book_obj# # 通过ORM操作给Book表增加数据# book_obj=Book.objects.create(title=validated_data['title'],# pub_time=validated_data["pub_time"],# category=validated_data["post_category"],# publisher_id=validated_data["publisher_id"]# )# book_obj.authors.add(*validated_data['author_list'])# return book_obj## #重写update 方法# def update(self, instance, validated_data):# # instance 更新的book_obj 对象# # validated_data 校验通过的数据# # ORM做更新操作 对每个字段进行更新# instance.title=validated_data.get('title',instance.title)# instance.pub_time = validated_data.get("pub_time", instance.pub_time)# instance.category = validated_data.get("post_category", instance.category)# instance.publisher_id = validated_data.get("publisher_id", instance.publisher_id)# #此处是对多对多个字段 进行查询# if validated_data.get("author_list"):# #set 因为是列表多个数据# instance.authors.set(validated_data["author_list"])# #编辑一定要更新# instance.save()# return instance## # 对单个值进行校验# def validate_title(self,value):# # value就是title的值 对value处理# if 'xxoo' not in value.lower():# raise serializers.ValidationError('少东西了')# return value## #对所有字段进行 校验# def validate(self, attrs):# # attrs 字典有你传过来的所有的字段# if 'xxoo' in attrs['title'].lower() and attrs["post_category"] == 1:# return attrs# else:# raise serializers.ValidationError('分类或标题不合符要求')
  10.  
  11. class BookSerializer(serializers.ModelSerializer):
  12.  
  13. #对多选字段,一对多,多对多字段 进行重新定义 此处为序列化的时候显示 category_display=serializers.SerializerMethodField(read_only=True) publisher_info=serializers.SerializerMethodField(read_only=True) authors_info=serializers.SerializerMethodField(read_only=True) #多选查找 obj 就是序列化的每个Book对象 def get_category_display(self,obj): return obj.get_category_display()
  14.  
  15. #一对多查找 def get_publisher_info(self,obj): #找到查找外键的对象 publisher_obj=obj.publisher #返回publisher表的内容 return {'id':publisher_obj.id,'title':publisher_obj.title}
  16.  
  17. #多对多的查找 def get_authors_info(self,obj): #找到所有的对象 authors_obj=obj.authors.all() # 返回authors表的内容 推到式 return [{"id":i.id,'name':i.name}for i in authors_obj]
  18.  
  19. class Meta: model=Book fields='__all__' # exclude=["id"] # 会让你这些所有的外键关系变成read_only = True 最多4层 不建议用 # depth = 1
  20.  
  21. #相当于extra_kwargs={"默认的字段名称":{自定义的参数配置信息}} #用在反序列化 给表字段添加参数 extra_kwargs={'publisher':{'write_only':True}, "authors": {"write_only": True}}
  22.  
  23. 视图封装代码
  1. from django.shortcuts import render
  2.  
  3. from rest_framework.views import APIView #视图from djangoDome.models import Bookfrom rest_framework.response import Response #相等于django的render等from SerDemo.serializers import BookSerializerfrom rest_framework.viewsets import ViewSetMixin #重做as_view(),可以传参,第三次封装from rest_framework import viewsets
  4.  
  5. # 封装为公共的类 都能用class GenericAPIView(APIView): # 此处为面向对象的设置静态变量一样 默认为空对其进行操作 queryset = None # 查到表的对象 serializer_class = None # 序列器
  6.  
  7. #定义方法 来取值 def get_queryset(self): return self.queryset.all()#此处用all()为数据在缓存中,显示全部数据
  8.  
  9. def get_serializer(self,*args,**kwargs): #用*接收 意思为有不同的方法 return self.serializer_class(*args,**kwargs)
  10.  
  11. #封装所有的 get 请求方法class ListModelMixin(object): def list(self,request): queryset=self.get_queryset() #取到所有的值 ser_obj=self.get_serializer(queryset,many=True)#用序列化器进行序列化 return Response(ser_obj.data)
  12.  
  13. # 封装所有的 post 请求方法class CreateModelMixin(object): def create(self,request):#request.data 是去到前端返回的值 ser_obj=self.get_serializer(data=request.data) if ser_obj.is_valid(): ser_obj.save() return Response(ser_obj.validated_data) return Response(ser_obj.errors)
  14.  
  15. # 封装所有的 get 请求方法(获取一条数据)class RetrieveModelMixin(object): def retrieve(self,request,id): book_obj=self.get_queryset().filter(id=id).first() ser_obj = BookSerializer(book_obj) return Response(ser_obj.data)
  16.  
  17. # 封装所有的 put请求方法(获取一条数据)class UpdateModelMixin(object): def update(self,request,id): book_obj=self.get_queryset().filter(id=id).first() ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True) if ser_obj.is_valid(): ser_obj.save() return Response(ser_obj.validated_data) return Response(ser_obj.errors)
  18.  
  19. #封装删除 delete 的请求方法class DestroyModelMixin(object): def destroy(self,request,id): book_obj = self.get_queryset().filter(id=id).first() if not book_obj: return Response("删除的对象不存在") book_obj.delete() return Response("")
  20.  
  21. #第二次封装 ()class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin): pass
  22.  
  23. class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin): pass
  24.  
  25. #此处为第二次封装的操作class BookView(ListCreateAPIView): queryset=Book.objects.all() serializer_class=BookSerializer
  26.  
  27. def get(self,request): return self.list(request)
  28.  
  29. def post(self,request): return self.create(request)
  30.  
  31. class BookEditView(RetrieveUpdateDestroyAPIView): queryset = Book.objects.all() serializer_class = BookSerializer
  32.  
  33. def get(self,request,id): return self.retrieve(request,id)
  34.  
  35. def put(self,request,id): return self.update(request,id)
  36.  
  37. def delete(self,request,id): return self.destory(request,id)
  38.  
  39. # 第三次封装 需要之前定义的 请求类class ModelViewSet(ViewSetMixin,ListCreateAPIView,RetrieveUpdateDestroyAPIView): pass
  40.  
  41. #此处为第三次封装的操作 (自己定义的方法)class BookModelView(ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer
  42.  
  43. #此处为第三次封装的操作 (django定义的方法)class BokModelView(viewsets.ModelViewSet): queryset = Book.objects.all() serializer_class = BookSerializer
  44.  
  45. #最原始的操作# class BookView(APIView):# #查看所有数据# def get(self,request):# book_obj=Book.objects.all()## # [book_obj, ]获取所有数据# # 用序列化器进行序列化# ser_obj= BookSerializer(book_obj,many=True)#many=True 显示 多条数据 单条数据不用# return Response(ser_obj.data)# # #新增数据# def post(self,request):# #先确定数据结构及数据类型# #对前端传来的数据进行校验# book_obj=request.data# ser_obj=BookSerializer(data=book_obj) #data 使用来进行反序的# #对虚拟器反序的数据做判断# if ser_obj.is_valid():# ser_obj.save()# #ser_obj.validated_data 为验证通过# return Response(ser_obj.validated_data)# #验证不通过 抛异常# return Response(ser_obj.errors)# # # class BookEditView(APIView):# #获取单条id# def get(self,request,id):# book_obj=Book.objects.filter(id=id).first()# ser_obj=BookSerializer(book_obj)# return Response(ser_obj.data)# # #更新单挑数据 用put# def put(self,request,id):# book_obj=Book.objects.filter(id=id).first()# #instance= data= 是反序所用的方法 partial=True 为部分校验,识别更新的# ser_obj=BookSerializer(instance=book_obj,data=request.data,# partial=True# )# # 对虚拟器反序的数据做判断# if ser_obj.is_valid():# ser_obj.save()# return Response(ser_obj.validated_data)# return Response(ser_obj.error)# # #删除数据# def delete(self,request,id):# book_obj=Book.objects.filter(id=id).first()# if not book_obj:# return Response('删除的对象不存在')# book_obj.delete()# return Response('')
  46.  
  47. url路由
  1. from django.conf.urls import urlfrom djangoDome import viewsfrom SerDemo import views
  2.  
  3. from rest_framework.routers import DefaultRouter # 帮助我们生成带参数的路由router=DefaultRouter() #实例化DsfaultRouterrouter.register('^book',views.BokModelView) # 注册我们的路由以及视图
  4.  
  5. urlpatterns = [
  6.  
  7. url(r'^book/$', views.BookView.as_view()),url(r'^book/(?P<id>\d+)/$', views.BookEditView.as_view()),
  8.  
  9. url(r'^book/$', views.BookModelView.as_view({"get": "list", "post": "create"})),url(r'^book/(?P<id>\d+)/$', views.BookModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),
  10.  
  11. django 自己封装的方法 pkurl(r'^book/$', views.BokModelView.as_view({"get": "list", "post": "create"})),url(r'^book/(?P<pk>\d+)/$', views.BokModelView.as_view({"get": "retrieve", "put": "update", "delete": "destroy"})),]
  12.  
  13. urlpatterns += router.urls
  1.  
  1.  

DRF 视图组件代码的更多相关文章

  1. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  2. DRF视图组件

    DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...

  3. DRF 视图组件,路由组件

    视图组件  -- 第一次封装   -- GenericAPIView(APIView):    queryset = None    serializer_class = None    def ge ...

  4. drf视图组件、认证组件

    视图组件 1.基本视图 url(r'^publish/$', views.PublishView.as_view()), url(r'^publish/(?P<pk>\d+)/$', vi ...

  5. DRF之视图组件

    不断的优化我们写的程序,是每个程序员必备的技能和职业素养,也是帮助我们成长的非常重要的手段. 使用serializer进行put接口设计 根据规范,PUT接口用来定义用户对数据修改的逻辑,也就是upd ...

  6. DRF - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构 , 通过序列化组件的ModelSerializer设计如下三个接口 : GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} ...

  7. DRF Django REST framework 之 视图组件(四)

    引言 在我们有几十上百的视图类,都有get,post等方法,在功能类似时,会导致大量的重复代码出现,显然还有很多可以优化的地方.这也就有了视图组件,它的功能非常强大,能很好的优化接口逻辑. 视图组件 ...

  8. 【DRF框架】视图组件

    基于mixins视图类 from rest_framework import mixins # 创建视图 class CreateModelMixin(object) def create(self, ...

  9. DRF的视图组件

    目录 DRF的视图组件 两大视图类 六大视图工具类 九大工具视图类 两大视图集基类 DRF的视图组件 DRF的视图组件大概分以下几类 两大视图类 APIView.GenericAPIView from ...

随机推荐

  1. websocket连接的后台反向代理问题

    今天要介绍的问题,是一个相对来说比较经典的问题,问题表面看不是很复杂的问题,但是反映出的背后通信逻辑,其实还是比较有意义的. websocket协议是当前绝大部分浏览器都支持的长连接协议,是HTTP协 ...

  2. hyperledger fabric各类节点及其故障分析 摘自https://www.cnblogs.com/preminem/p/8729781.html

    hyperledger fabric各类节点及其故障分析   1.Client节点 client代表由最终用户操作的实体,它必须连接到某一个peer节点或者orderer节点上与区块链网络通信.客户端 ...

  3. WPF Demo19 命令、UC

    命令系统的基本元素和关系WPF命令系统的组成要素:A.命令(command):WPF命令实际上就是实习了ICommand接口的类.平时使用最多的就是RoutedCommand类.B.命令源(comma ...

  4. 黄聪:FFmpeg视频转码技巧之-crf参数(H.264篇)

    昨天,有个朋友给我出了个难题:他手上有一个视频,1080P的,49秒,200多兆:要求在确保质量的情况下把文件压缩到10M以内. 这是什么概念呢?按照文件大小10M来计算,码率是:10 x 8 / 4 ...

  5. JS中模态窗口(showModalDialog)的详细使用

    基本介绍: showModalDialog() (IE + 支持) showModelessDialog() (IE + 支持) window.showModalDialog() 方法用来创建一个显示 ...

  6. HTTP API网关选择之一Kong介绍

    为什么需要 API 网关 在微服务架构之下,服务被拆的非常零散,降低了耦合度的同时也给服务的统一管理增加了难度.如上图左所示,在旧的服务治理体系之下,鉴权,限流,日志,监控等通用功能需要在每个服务中单 ...

  7. BOF、EOF 属性

    BOF.EOF 属性 BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前. EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后. 返回值 BOF 和 EOF  ...

  8. 996ICU的感悟

     并不只是口头上的支持,吉多·范罗苏姆近日又在 Python 官方论坛发布一篇名为<Can we do something for 996 programmers in China?>(我 ...

  9. CAP在MySQL的分析

    此文转载在登博的文章,给大家分享 问题一:数据一致性.在不使用共享存储的情况下,传统RDBMS(例如:Oracle/MySQL/PostgreSQL等),能否做到在主库出问题时的数据零丢失. 问题二: ...

  10. Redis整合Spring实现分布式锁

    spring把专门的数据操作独立封装在spring-data系列中,spring-data-redis是对Redis的封装 <dependencies> <!-- 添加spring- ...