zoukankan      html  css  js  c++  java
  • serializers序列化,反序列化,局部全局钩子

    昨日回顾:
    1 restful规范
    -前后端分离
    -前端一个项目,后端一个项目
    -微服务
    -单体应用
    -一个一个服务
    -集群和分布式
    - 集群是分布在多台服务器,分布式就是将项目分成一个个服务,每个服务可以集群
    1 通常用HTTPS协议
    2 域名部署
    -api.baidu.com
    -www.baidu.com/api
    3 版本
    -www.baidu.com/api/v2
    -版本号放在请求头中
    4 路径都是名词(可以用复数)
    5 根据不同的请求方式,执行不同操作
    -delete请求表示删除资源
    -patch
    -post
    什么是幂等性,put和patch请求是幂等性,post请求不是幂等性
    6 请求地址中携带过滤条件
    7 状态码
    -{status:100,error:成功,data:[{},{},{}]}
    8 错误信息
    9 响应的数据格式:
    -所有数据:列表
    -删除数据:返回一个空:{status:100,error:删除成功,data:""}
    -修改数据:{status:100,error:修改成功,data:{id:1,title:金瓶}}
    10 返回的数据中携带连接
    2 CBV执行流程(继承View)
    -路由中配置 类名.as_view()----放了个函数的内存地址
    -当请求来了:内存地址(request,其他参)
    -内部又调用的dispatch方法,dispatch方法中通过反射,根据请求方式的不同,执行不同的方法
    3 安装drf

    4 drf执行流程,APIView,Request
    -继承APIView(继承自view),重写了dispatch方法
    -dispatch方法:1 request对象,被重新封装了,成了新的request 这个方法做的事:self.initialize_request(request, *args, **kwargs)
    -self.initial(request, *args, **kwargs)
    -认证,权限,频率
    -Request类:drf写的类
    -data: body体中的数据
    -request._request:原来的request
    -request.POST/method.... 重写了__getattr__方法
    class BookSerializer(serializers.Serializer):
    name=serializers.CharField(source=‘title’(对应原表里的title))#source三种用法
    publish=serializers.CharField(source='publish.name')#可设置对应关系表李某一字段,还可以指定表模型的方法,#指定方法的时候,执行该方法,并将返回值付给xx这个变量

    author=serializers.SerializerMethodField()
    def get_autor(self,obj):
    return
    {'id':obj.author.pk,'name':obj.author.name}
        # 实例化一个作者的序列化类对象
    # author_ser=AuthorSerializer(author_list,many=True)
    #
    # return author_ser.data
    class BookSerializer(serializers.ModelSerializer):
    class Meta:
    model=models.Book
    fields='___all__'
    depth=1 #几层
    可以写单个字段进行覆盖
    def validate_name(self,value):
    if value.startswith('sb'):
    #不能让你过
    raise ValidationError('书名不能以sb开头')
    else:
    return value
    # def validate(self,a):
    # # print(a)
    # name=a.get('name')
    # price=a.get('price')
    # if name != price:
    # raise ValidationError('错了')
    # else:
    # return a
    # 指定要序列化的字段
    # fields=['nid','name']
    #序列化所有字段
    fields='__all__'
    #选择要排除的字段(注意,不能跟fields连用)
    # exclude=['name','price']
    #深度,官方建议最多写10,我个人建议最多写3
    # depth=1
    view视图函数层
    #不使用序列化组件
    # def get(self, request, *args, **kwargs):
    # response = {'status': 100, 'msg': '获取成功'}
    # book_list = models.Book.objects.all()
    # book_ll=[{'id':book.pk,'name':book.name,'price':book.price} for book in book_list]
    # # book_ll=[]
    # # for book in book_list:
    # # book_ll.append({'id':book.pk,'name':book.name})
    # response['data']=book_ll
    # # return JsonResponse(response,safe=False)
    # # 以后推荐用这种,一定要注册一下rest_framework
    # return Response(response)
    class Books(APIView):
    def get(self,request):
    book_list=models.Book.objects.all()
    response={'statue':1,'msg':'获取成功'}
    response['data']=MySerializer.BookSerializer(book_list,many=True).data
    return Response(response)

    def post(self,request):
    response = {'statue': 1, 'msg': '新增成功'}
    try:
    book=MySerializer.BookSerializer(data=request.data)
    if book.is_valid():
    book.save()
    response['data'] = book.data
    else:
    response['msg']=book.errors

    except Exception as e:
    response['msg'] = e
    return Response(response)

    反序列化


    多本书 many=Ture 单 many=False
    class Book(APIView):
    def get(self,request,id,*args,**kwargs):
    book=models.Book.objects.filter(id=id).first()
    response = {'statue': 1, 'msg': '获取成功'}
    response['data']=MySerializer.BookSerializer(book,many=False).data
    return Response(response)
    def put(self,request,id):
    book=models.Book.objects.filter(id=id).first()
    response = {'statue': 1, 'msg': '修改成功'}
    try:
    book=MySerializer.BookSerializer(book,data=request.data)
    if book.is_valid():
    book.save()
    response['data'] = book.data
    else:
    response['msg']=book.errors

    except Exception :
    response['msg'] = '错误'
    return Response(response)
    def delete(self,request,id):
    response = {'statue': 1, 'msg': '删除成功'}
    try:
    models.Book.objects.filter(id=id).first().delete()
    except Exception:
    response['msg']='未知错误'
    return Response(response)






















  • 相关阅读:
    类的创建
    线性规划
    break、continue、pass介绍
    array numpy 模块
    hive字符串函数
    进化的Spark, 从DataFrame说起
    hive sql split 分隔符
    Spark On YARN内存分配
    浅谈Spark应用程序的性能调优
    Spark-Mllib(二)基本统计
  • 原文地址:https://www.cnblogs.com/wrqysrt/p/10601504.html
Copyright © 2011-2022 走看看