2020.7.11 Serializer序列化器

发布于 2020-07-11  27 次阅读


1.复习内容

  • getattr(),hasattr(),setattr()使用

    • getattr(object, name[, default]) default是返回的默认值
      • 获取到方法,可以被执行
    • hasattr(object, name)
    • setattr(object, name, value)
  • 序列化器 create和update的参数是什么类型

    • 都是一个字典类型
  • 序列化器read_only和write_only

    • read_only
      • 序列化时候使用,可以判断验证码
      • read_only 只能读不能写
      • read_only的字段在serializer中效验使用
      • 常使用在id字段,可以读,不能写
    • write_only
      • 反序列化时候时候使用
      • write_only 只能写不能读
      • 常使用在password
  • python魔法属性 __dict__

  • django safe属性

    • safe将html生成安全的文本,
    • 将整型转为字符串:
  • exceptions.ValidationError:

    • ["'3' value must be either True or False."]
    • 数据库中将bool字段设置成了3,
    • 数据库中真=1,假=0
  • serializer_class = Serializer

    • 不要加括号~
  • 动态给对象添加方法

    • MethodType()
    • 1.绑定到对象
      • 对象.方法名 = methodType(方法名,对象名,类名)
    • 2.绑定到类(有None)
      • 类.方法名 = methodType(方法名,类名)
    • 3.绑定到类(没None)
      • 类.方法名 = methodType(方法名,类名)
    • https://blog.csdn.net/yuanyangsdo/article/details/60776612

2.灵感代办

  • assert 使用

3.学习内容

  • ModelSerializer模型类

    • 作用:

      • 根据model自动生成属性
      • 方便修改添加属性字段
      • 继承自Serializer 实现了create ,update方法
    • 使用:

      • 1.继承ModelSerializer模型类
      • 2.定义类Meta 定义属性
        • model = 模型类
        • fields = (需要生成的字段,)
        • 自动生成的字段,不满足需要,就直接在类中指定字段选项参数
        • fields = “__all__” 所有字段
        • extra_kwargs={“bcomment”:{max_value:100}} 也是指定字段选项参数
        • exclude = (‘取反的字段’)
        • read_only_fields=(字段,) 给字段添加read_only
      • 3.已经定义了create(),和update()方法
      • 4.数据验证只有unique实现
        • 自动实现unique验证方法
        • 别的数据验证方式还是使用 validate_field_name()方法
    • 技巧:

      • 可以指定没有的字段 (验证码),要么fields是all,要么要给field指定
    • 出现错误:

      • 应该继承ModelSerializer,(不要继承ModelField)
  • 两个基本类视图

    • APIView

      • 继承自django的View
      • 增加了
        • 权限功能,组管理员
        • 认证功能,账号密码
        • 限流功能,ip访问次数,限制单ip爬虫程序
      • 使用方法:
        • 1.继承APIView
        • 2.request的
          • request.data 自动转换成json 表单文件接收
          • request.query_param() 查询字符串接收
        • 3.Response()返回对象
          • 不用safe
    • GenericApiView

      • 继承自ApiView
        • 分页功能
        • 过滤排序功能
        • 指定查询集 (惰性查询,缓存数据)
          • queryset= 查询集 model.objects.all()
        • 指定序列化器 整个类使用一个序列化器
          • serializer_class = 序列化器
          • 注意 序列化器不要加括号
      • 使用方法:
        • 继承GenericApiView
        • 指定查询集 queryset (数据库中的数据)
        • 指定序列化器 serializer_class
        • 使用查询集/序列化器
          • get_queryset()
          • get_serializer(instance=books,data=data,many=True)
          • get_object() 获取单一数据对象
  • 五大拓展类(配合GenericAPIView)

    • 作用:
      • 继承自object
      • 封装了增删改查方法
    • 注意:
      • 需要定义查询集和序列化器queryset serializer_class
    • 使用:
      • 1.继承GenericApiView
      • 2.继承扩展类
      • 3.在get或post中 return 调用self.cretae() self.list() …
    • LIstModelMixin 获取多个数据
      • list()
    • CreateModelMixin 保存数据
      • create()
    • RetrieveModelMixin 获取单一数据
      • retrieve()
    • UpdateModelMixin 更新数据
      • update()
    • DestoryModeMixin 删除数据
      • destory()
  • 五大扩展类子类

    • 作用:
      • 更简化代码,post和get都已经实现
      • 需要定义查询集和序列化器queryset serializer_class
  • 视图集()

    • 路由匹配规则,视图定义方法改变(post,get)
    • 两个基本视图集
      • ViewSet 继承自APIView
      • GenericViewset 继承自GenericAPIView
    • 两个拓展视图集
      • ModelViewSet 继承GenericAPIView 继承五个拓展类
        • 增删改查功能
      • ReadOnlyViewSet 继承了GenericAPIVIew 继承了ListModelMixin ,RetrieveModelMixin
        • 单一多个数据获取
  • 视图集ViewSet的使用方法

    • (区别命名形式,路由定义)
    • 1.继承ViewSet
    • 2.自定义方法,整体和post,get还是差不多
    • 3.路由定义 as_view({}) 传递一个字典,”get”:自定义方法,post:”自定义方法”
      • list(),create(),update(),destory(),resrieve()
    • 4.自定义方法,路由器匹配
      • url(r^books/list_data$,views.as_views({“get”,”last_data“}))
  • 视图集GenericViewSet的使用方法

    • 1.指定queryset,指定serializer_class
    • 2.和GenericAPIView使用方式差不多
    • 3.路由定义 as_view({}) 传递一个字典,”get”:自定义方法,post:”自定义方法”list(),create(),update(),destory(),resrieve()
    • 4.自定义方法,路由器匹配url(r^books/list_data$,views.as_views({“get”,”last_data“}))
  • 拓展视图集ModelViewSet的使用方法

    • 1.指定queryset,指定serializer_class】
    • 2.增删改查全部已经自动动被实现
    • 3.路由匹配规则和视图集的匹配规则一致
  • 自动生成路由SimpleRouter(需要类是视图集)

    • DefaultRouter 是 SimpleRouter使用方式一样
      • 多了一个首页匹配 “/”
    • 视图集:ViewSet、GenericViewSet、ModelViewSet
    • 1.在url中导入SimpleRouter
    • 2.生成一个路由对象
      • router = SimpleRouter()
    • 3.注册一个路由
      • router.register(‘books_drf’,modelview.Books,base_name=’‘books’)
        • 1.路由路径
        • 2.视图类
        • 3.路由的命名空间
    • 4.获取router.urls,放入ulrpatterns
    • 5.自定义视图类 不会自动生成路由
      • @action(methods=[‘get’],detail=True)
        • 参数1:匹配的方法
        • 参数2:detail匹配多余参数 比如id (正则匹配)
        • self.action 属性 就是自定义视图方法名称
  • 指定不同的Serializer

    • 重写方法get_serializer_class()
    • 在方法中判断self.action属性,
    • 根据不同的self.action返回不同的序列号器

4.扩展延伸知识

  • DRF中ser.error_messages属性

    • 是查看定义错误信息
  • 在Serializer中定义的create 和update返回的对象是?

    • 都是model类的实例,create需要在里面创建实例
    • update的instance就是实例,需要save()数据
  • 字典取出数据可以试试pop

    • 只读取数据情况下适用
    • 框架中取出字典都是用pop(‘key’)
  • HTTP方法作用

    • get 获取单条 多条数据、
    • post 创建一个新数据
    • put 更新数据
    • delete 删除数据

5.知识内容个人梳理

6.今天都复习了之前的什么内容


Ares个人进阶之路