zoukankan      html  css  js  c++  java
  • 序列化和反序列化

    序列化操作

    # 创建User对象
    user = User(name='smart', age=18)
    
    # 使用UserSerializer将user对象序列化为如下字段数据:{'name': 'smart', 'age': 18}
    serializer = UserSerializer(user)
    
    # 获取序列化之后的数据
    serializer.data
    
    • 序列化多个对象
    • 如果要被序列化的是包含多个对象的查询集QuerySet或list,在创建序列化器对象时,需要添加many=True参数。
    books = BookInfo.objects.all()
    
    serializer = BookInfoSerializer(books, many=True)
    -  获取序列化之后的数据
    serializer.data
    # [
    #   OrderedDict([('id', 2), ('btitle', '天龙八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40)),
    #   OrderedDict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24'), ('bread', 20), ('bcomment', 80)),
    #   OrderedDict([('id', 4), ('btitle', '雪山飞狐'), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24)),
    #   OrderedDict([('id', 5), ('btitle', '西游记'), ('bpub_date', '1988-01-01'), ('bread', 10), ('bcomment', 10)])
    # ]
    

    注:OrderedDict是有序字典类型。


    关联对象嵌套序列化

    1)PrimaryKeyRelatedField

    # 在HeroInfoSerializer中添加此字段
    hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
    或
    hbook = serializers.PrimaryKeyRelatedField(label='图书', queryset=BookInfo.objects.all())
    

    • 使用场景:
      1.一般用于关联字段进行校验时使用,但关联字段很少校验
      2.在序列化某种模型时,需要一次性将关联的数据都序列化出来(拿到spu,找到规格,规格找到选项)
      3.需要将关联序列化之后的结果直接展示在页面的时候,比如当选定spu时候,显示对应的规格,一般返回名称

    many参数



    反序列化操作

    • 反序列化操作-数据校验
    # 准备数据
    data = {'name': 'admin', 'age': 30}
    
    # 使用UserSerializer对data中的数据进行反序列化校验
    serializer = UserSerializer(data=data)
    
    # 调用is_valid进行数据校验,成功返回True,失败返回False
    serializer.is_valid()
    
    # 获取校验失败之后的错误提示信息
    serializer.errors
    
    # 获取校验通过之后的数据
    serializer.validated_data
    

    注:调用is_valid时,会根据对应序列化类字段是否需要传递、字段类型以及一些选项参数对data中的数据进行校验。

    补充验证

    在调用is_valid进行数据校验时,除了一些基本的默认验证行为,可能还需要补充一些验证行为,比如有如下需求:
    1)在进行btitle验证时,要求btitle的内容必须含有django。
    2)在进行bread和bcomment验证时,要求bread必须大于等于bcomment。
    需要再补充验证行为,可以使用以下三种方法

    1. validators : 针对指定序列化器字段添加validators选项参数补充校验

    2. validate_<field_name> : 在序列化器类中定义特定方法validate_<field_name>,针对特定字段进行补充验证

    3. validate : 在序列化器类中定义validate方法针对多个字段的内容进行补充验证

    数据保存

    在数据校验通过之后,想要基于validated_data完成数据的保存,可以通过序列化器对象.save()进行数据的保存

    • create方法中实现数据新增
    • update方法中实现数据更新
      如果没有传递instance实例,调用save()方法的时候,create()被调用,相反,如果传递了instance实例,调用save()方法的时候,update()被调用
  • 相关阅读:
    ES6 Symbol类型 附带:Proxy和Set
    why updating the Real DOM is slow, what is Virtaul DOM, and how updating Virtual DOM increase the performance?
    React高级指南
    池(Pool)
    计算机网络Intro
    React基础
    CommonJS 与 ES6 的依赖操作方法(require、import)
    webpack初识(biaoyansu)
    关于时间安排贪心算法正确性的证明
    DP总结
  • 原文地址:https://www.cnblogs.com/oklizz/p/11272989.html
Copyright © 2011-2022 走看看