序列化器代码

# 声明序列化器from rest_framework import serializersfrom djangoDome.models import Book

class PublisherSerializer(serializers.Serializer):    id = serializers.IntegerField()    title = serializers.CharField(max_length=32)

class AuthorSerializer(serializers.Serializer):    id = serializers.IntegerField()    name = serializers.CharField(max_length=32)

#自定义字段def my_validate(value):    if 'xxoo' in value.lower():        #抛敏感词汇        raise serializers.ValidationError('敏感词汇')    return value

# 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('分类或标题不合符要求')

class BookSerializer(serializers.ModelSerializer):

    #对多选字段,一对多,多对多字段 进行重新定义  此处为序列化的时候显示    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()

     #一对多查找    def get_publisher_info(self,obj):        #找到查找外键的对象        publisher_obj=obj.publisher        #返回publisher表的内容        return {'id':publisher_obj.id,'title':publisher_obj.title}

    #多对多的查找    def  get_authors_info(self,obj):        #找到所有的对象        authors_obj=obj.authors.all()        # 返回authors表的内容 推到式        return [{"id":i.id,'name':i.name}for i in authors_obj]

    class Meta:        model=Book        fields='__all__'        # exclude=["id"]        # 会让你这些所有的外键关系变成read_only = True 最多4层 不建议用        # depth = 1

        #相当于extra_kwargs={"默认的字段名称":{自定义的参数配置信息}}        #用在反序列化 给表字段添加参数        extra_kwargs={'publisher':{'write_only':True},                      "authors": {"write_only": True}}

视图封装代码
from django.shortcuts import render

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

# 封装为公共的类 都能用class GenericAPIView(APIView):    # 此处为面向对象的设置静态变量一样 默认为空对其进行操作    queryset = None  # 查到表的对象    serializer_class = None  # 序列器

    #定义方法 来取值    def get_queryset(self):        return self.queryset.all()#此处用all()为数据在缓存中,显示全部数据

    def get_serializer(self,*args,**kwargs): #用*接收 意思为有不同的方法        return self.serializer_class(*args,**kwargs)

#封装所有的 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)

# 封装所有的 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)

# 封装所有的 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)

# 封装所有的 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)

#封装删除 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("")

#第二次封装  ()class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):    pass

class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):    pass

#此处为第二次封装的操作class BookView(ListCreateAPIView):    queryset=Book.objects.all()    serializer_class=BookSerializer

    def get(self,request):        return self.list(request)

    def post(self,request):        return  self.create(request)

class BookEditView(RetrieveUpdateDestroyAPIView):    queryset = Book.objects.all()    serializer_class = BookSerializer

    def get(self,request,id):        return self.retrieve(request,id)

    def put(self,request,id):        return self.update(request,id)

    def delete(self,request,id):        return self.destory(request,id)

# 第三次封装 需要之前定义的 请求类class ModelViewSet(ViewSetMixin,ListCreateAPIView,RetrieveUpdateDestroyAPIView):    pass

#此处为第三次封装的操作 (自己定义的方法)class BookModelView(ModelViewSet):    queryset = Book.objects.all()    serializer_class = BookSerializer

#此处为第三次封装的操作 (django定义的方法)class BokModelView(viewsets.ModelViewSet):    queryset = Book.objects.all()    serializer_class = BookSerializer

#最原始的操作# 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('')

url路由
from django.conf.urls import urlfrom djangoDome import viewsfrom SerDemo import views

from rest_framework.routers import DefaultRouter # 帮助我们生成带参数的路由router=DefaultRouter() #实例化DsfaultRouterrouter.register('^book',views.BokModelView) # 注册我们的路由以及视图

urlpatterns = [

url(r'^book/$', views.BookView.as_view()),url(r'^book/(?P<id>\d+)/$', views.BookEditView.as_view()),

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"})),

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"})),]

urlpatterns += router.urls

												

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. Github使用说明 --整理者米米

    打开百度搜索Git官网下载对应的windows版本 傻瓜式默认安装,点击完成 PS:安装的过程比较慢 安装完成后打开命令行窗口(cmd) 查看版本号------git --version   安装成功 ...

  2. 在free bsd上跑JMeter 的 plugin "PerfMon Server Agent"

    在free bsd上跑JMeter 的 plugin "PerfMon Server Agent" 目的: 在free bsd上跑JMeter 的 plugin "Per ...

  3. Feign 请求拦截器和日志

    Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参 ...

  4. ueditor图片上传和显示问题

    图片上传: 这段是contorller代码 @RequestMapping(value = "/uploadImg", method = RequestMethod.POST) @ ...

  5. driftnet 抓取图片总结

    语法: driftnet   [options]   [filter code] 主要参数: -b               捕获到新的图片时发出嘟嘟声 -i  interface     选择监听 ...

  6. ☞上一篇无聊文章 分析网站CSS构架流程(一)

    1.无力吐槽 2.reset.css 3.功能css() 4.单页面CSS 5.网站通用样式库 6.图标文件库

  7. ubuntu-docker入门到放弃(三)images镜像管理

    docker虽然有公共的镜像管理hub,但是我们在日常的使用中,由于不同的业务场景,不同的架构,公共的镜像库不能满足需求,并且出于安全考虑,会搭建私有的docker hub镜像库来管理自己的image ...

  8. TensorFlow:tf.nn.max_pool实现池化操作

    tf.nn.max_pool(value, ksize, strides, padding, name=None) 参数是四个,和卷积很类似: 第一个参数value:需要池化的输入,一般池化层接在卷积 ...

  9. WPF Demo12 布局

    1 <Window x:Class="布局.DockPanel1" xmlns="http://schemas.microsoft.com/winfx/2006/x ...

  10. 黄聪:windowss7显示桌面图标设置在任务栏的解决办法

    1.新建一个本文文档,将以下内容复制进去: [Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop 2.将该 ...