序列化组件

-序列化组件
  -使用drf的序列化组件
  -1 新建一个序列化类继承Serializer
  -2 在类中写要序列化的字段

  -在视图中使用序列化的类
    -1 实例化序列化的类产生对象,在产生对象的时候,传入需要序列化的对象(queryset)
    -2 对象.data
    -3 return Response(对象.data)


  -高级用法:
    -source:可以指定字段(name publish.name),可以指定方法,
    -SerializerMethodField搭配方法使用(get_字段名字)
    publish_detail=serializers.SerializerMethodField(read_only=True)
    def get_publish_detail(self,obj):
      return {'name':obj.publish.name,'city':obj.publish.city}
    -read_only:反序列化时,不传
    -write_only:序列化时,不显示

-Serializers:没有指定表模型

  需要重写create方法**

  -source:指定要序列化哪个字段,可以是字段,可以是方法
  - SerializerMethodField的用法

    可以自定义返回的对象  
    authors=serializers.SerializerMethodField()
    def get_authors(self,obj):
      ret=AuthorSerializer(instance=obj.authors.all(),many=True)
      return ret.data

-ModelSerializers:指定了表模型

  无需重写create方法**
  class Meta:
    model=表模型
    #要显示的字段
    fields=('__all__')
    fields=('id','name')
    #要排除的字段
    exclude=('name')
    #深度控制(可跨表的次数)
    depth=1
  -重写某个字段
    在Meta外部,重写某些字段,方式同Serializers


-反序列化
  -使用继承了Serializers序列化类的对象,反序列化
    -在自己写的序列化类中重写create方法
    -重写create方法,实现序列化
    -在序列化类中:
      def create(self, validated_data):
        ret=models.Book.objects.create(**validated_data)
          return ret
    -在视图中:
      def post(self,request):
        bookser=BookSerializer(data=request.data)
        if bookser.is_valid():
          ret=bookser.create(bookser.validated_data)
          return Response()

  -使用继承了ModelSerializers序列化类的对象,反序列化
    -在视图中:
      def post(self,request):
        bookser=BookSerializer(data=request.data)
        if bookser.is_valid():
          ret=bookser.save()
        return Response()

-反序列化的校验
  -validate_字段名(self,value):
    -如果校验失败,抛出ValidationError(抛出的异常信息需要去bookser.errors中取)
    -如果校验通过直接return value
  -validate(self,attrs)
    -attrs所有校验通过的数据,是个字典
    -如果校验失败,抛出ValidationError
    -如果校验通过直接return attrs

-读源码推荐
  -全局和局部钩子源码部分
  -在序列化的时候,传many=True和many=False,生成的对象并不是一个对象
  -bookser.data
    -之前执行过,直接返回
    -get_attribute(instance, self.source_attrs)
      -self.source_attrs 是source指定的通过 . 切分后的列表
      -instance 当前循环到的book对象

-总结一些坑

  -在多对多或者外键关联的情况下,可以直接通过save创建数据或者修改数据,在一对一的关系下由于要操作多张表,可以通过validate_data来获取数据,自己去对数据进行存储或者修改。

  -在通过validate_data获取数据的时候,要通过CharFiled来获取,不能通过字段SerializerMethodField来拿到

        -如果没有通过is_valid进行判断,无法通过validate_data取值,会直接报错

  -规范请求为get获取,post增加,put修改,delete删除

-步骤总结

  -1 写一个序列化的字段类,去进行字段的校验和返回

  -2 在视图中产生对象进行操作

  -3 通过is_valid来判断是否通过校验,然后进行下一步操作(如果不进行判断,无法通过validate_data取值)

  -4 进行对数据的操作

  -5返回数据

        拿到数据,修改数据,返回数据就是序列化组件的核心

原文地址:https://www.cnblogs.com/xuxingping/p/11122612.html