django序列化与反序列化

from rest_framwork import serializers

serializers.ModelSerializer

模型类序列化器,必须依据模型类创建序列化器

  • 基于模型类自动生成一系列字段
  • 包含默认的 crate()和update()

    定义ModelSerializer类

    定义序列化器

  • class BookInfoSerializer(serializer.ModelSerializer):
    class Meta:
    model = BookInfo
    filels = 'all'
    read_only_fields = ('id', 'readcount', 'commentcount')
    extra_kwargs = {
    'readcount': {'min_value': 0, 'required': True},
    'commentcount': {'max_value': 0, 'required': True},
    }

    • model,指明参照的那个模型类
    • fields ,指明为模型类的那些字段生成
      • fields = ‘all’表示所有字段
      • exclude = ('iamge',) 表示排除哪些字段
      • fields = ('id','name','readcount') 表示显示哪些字段
    • read_only_fields指明只读字段,即仅用于序列化输出的字段
    • extra_kwargs,为ModelSerializer添加或修改原有的选型参数
      • extra_kwargs = {
        'readcount': {'min_value': 0, 'required': True},
        'commentcount': {'max_value': 0, 'required': True},
        }

        serailizers.Serializer

        即可以为数据库模型类定义,也可以为非数据库模型类的数据定义

        定义Serializer类

        定义序列化器

  • class BookInfoSerializer(serializers.Serializers)
    id = serializers.IntegerField(label='ID', read_only=True)
  • 字段和选选项

    创建Serializer对象

  • s = BookInfoSerializer(instance=None, data=empty, **kwarg)
    • instance:使用数据库对象赋值,用于序列化
      data:字典类型数据,用于反序列化

      序列化

  • 将程序中的数据结构类型转换为其他类型(字典,JSON,XML)Django中将模型类转化为JSON
  • 基本使用
    • 获取需要序列化的对象

      • from book.models import BookInfo
        book = BookInfo.objects.get(id=4)

        • books = BookInfo.objects.all()
    • 构造序列化器对象
      • from book.serializers import BookInfoSerializer
        serializer = BookInfoSerializer(instance=book)

        • serializer = BookInfoSerializer(instace=books, many=True)
    • 获取序列化数据
      • serializer.data
  • 关联对象嵌套序列化
    • 如果需要序列化的数据中包含有其他关联对象,则对关联对象数据的序列化需要指明
    • 关联的对象数据是一个
      • PrimaryKeyRelatedFiled

        • class PeopleInfoSerializer(serializers.Serializer):
          #book = serializers.PrimaryKeyRelatedFiled(label='图书',read_only=True)
          book = serializers.PrimaryKeyRelatedFiled(label='图书',queryset=BookInfo.objects.all())

          • 包含read_only=True时,该字段不能用于反序列化使用
          • 包含queryset参数时,将被用作反序列化时参数校验使用
        • 使用序列化器对象的data方法时
          对应字段显示的是本表数据

          • {'id': 10, 'book': 3, 'description': '独孤九剑', 'gender': 1, 'name': '令狐冲'}
      • StringRelatedFiledd
        • 此字段被序列化为关联对象的字符串表示方式(即__str__方法的返回值)
        • book = serializers.StringRelatedFiled(label='图书')
          • class BookInfoSerializer(serializers.serializer):
            ...
            def str(self):
            return self.name
        • 使用序列化器对象的data方法时
          对应字段显示的关联表__str__方法返回的数据

          • {'description': '独孤九剑', 'name': '令狐冲', 'gender': 1, 'book': '笑傲江湖', 'id': 10}
      • 使用关联对象的序列化器
        • book = BookInfoSerializer()
        • 使用序列化器对象的data方法时
          对应字段显示的式OrderDict对象=有序字典

          • {'book': OrderedDict([('id', 3), ('name', '笑傲江湖'), ('pub_date', '1995-12-24'), ('readcount', 28), ('commentcount', ('image', None)]), 'gender': 1, 'name': '令狐冲', 'description': '独孤九剑', 'id': 10}
    • 关联对象的数据是多个
      • many参数
      • 使用django创建模型类的时候,一对多的一表有peopleinfo_set隐藏字段
      • 如果关联对象的数据不是只有一个,而是包含多个数据,如想序列化对应数据时,此时关联字段类型的指明仍使用上述方法,只是在声明关联字段时,多补充一个many=True参数即可
        • class BookInfoSerializer(serializers.Serializer):
          peopleinfo_set = serializers.PrimarykeyRelatedField(read_only=True,many=True)
  • from book.models import BookInfo
    from book.serializers import BookInfoSerializer
    book = BookInfo.objects.get(id=3)
    serializer = BookInfoSerializer(book)
    serializer.data
    {'id': 3, 'peopleinfo_set': [10, 11, 12, 13], 'commentcount': 18, 'name': '笑傲江湖', 'readcount': 28, 'pub_date': '199-24', 'image': None}

    反序列化

  • 与序列化相反,Django中将JSOn字符串转化为Django中的模型类对象
  • 验证数据
    • from book.serializers import BookInfoSerializer
      data = {'pub_date':123}
      serializer = BookInfoSerializer(data=data)
      serializer.is_valid()
      False
      serializer.errors
      {'pub_date': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')], 'name': [ErrorDetail(string='This field is required.', code='required')]}
      serializer.validated_data
      {}

    • 使用序列化器进行反序列化时,需要对数据进行验证后,才能获取
      验证成功的数据或保存成模型类对象
    • 序列化器对象调用is_valid()
      • 通过字段类型和选型验证,验证成功返回True,失败返回False
      • is_valid(raise_exception=True)
        • 验证失败后抛出serializers.ValidationError
        • 向前端返回HTTP 400 Bad Request响应
      • 自定义验证方法
        • validate_

          • 在序列化器中定义固定方法,验证单一字段

            • class BookInfoSerializer(serializers.Serializer):
              """图书数据序列化器"""
              id = serializers.IntegerField(label='ID', read_only=True)
              peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增
              def validate_readcount(self,value):
              if value < 0:
              raise serializers.ValidationError('阅读数量不能为负数')
              return value
        • validate
          • 在序列化器中定义固定方法,验证多个字段

            • class BookInfoSerializer(serializers.Serializer):
              id = serializers.IntegerFiled(label='ID',read_only=True)
              readcount = serializers..IntegerFiled(label='阅读量',required=False)
              commentcount = serializers..IntegerFiled(label='评论量',required=False)
              def validate(self,attrs):
              readcount = attrs.get('readcount')
              commentcount = attrs['commentcount']
              if commentcount > readcount:
              raise serializers.ValidationError('评论量不能大于阅读量')
              returen attrs
        • validators
          • 在字段中添加validators选项参数,补充验证行为

            • class BookInfoSerializer(serializers.Serializer):

    def custom_validate(value):
    raise serializers.ValidationError('我就是来捣乱的')

    """图书数据序列化器"""
    id = serializers.IntegerField(label='ID', read_only=True)
    name = serializers.CharField(label='名称', max_length=20,validators=[custom_validate])
    pub_date = serializers.DateField(label='发布日期', required=False)
    readcount = serializers.IntegerField(label='阅读量', required=False)
    commentcount = serializers.IntegerField(label='评论量', required=False)
    image = serializers.ImageField(label='图片', required=False)
    peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增

    • 序列化器对象调用errors

      • 验证失败获取错误信息
      • 验证成功,获取错误信息
    • 序列化器调用validated_data
      • 验证成功获取数据
  • 保存
    • 如果在验证成功后,想要基于validated_data完成数据对象的创建,可以通过实现create()和update()两个方法来实现。

      • class BookInfoSerializer(serializers.Serializer):

    """图书数据序列化器"""
    id = serializers.IntegerField(label='ID', read_only=True)
    name = serializers.CharField(label='名称', max_length=20)
    pub_date = serializers.DateField(label='发布日期', required=False)
    readcount = serializers.IntegerField(label='阅读量', required=False)
    commentcount = serializers.IntegerField(label='评论量', required=False)
    image = serializers.ImageField(label='图片', required=False)
    peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增

    def create(self, validated_data):
    """新建"""
    return BookInfo(**validated_data)

    def update(self, instance, validated_data):
    """更新,instance为要更新的对象实例"""
    instance.name = validated_data.get('name', instance.name)
    instance.pub_date = validated_data.get('pub_date', instance.pub_date)
    instance.readcount = validated_data.get('readcount', instance.readcount)
    instance.commentcount = validated_data.get('commentcount', instance.commentcount)
    return instance

    • 如果需要在返回数据对象的时候,也将数据保存到数据库中,则可以进行如下修改

      • class BookInfoSerializer(serializers.Serializer):

    """图书数据序列化器"""
    id = serializers.IntegerField(label='ID', read_only=True)
    name = serializers.CharField(label='名称', max_length=20)
    pub_date = serializers.DateField(label='发布日期', required=False)
    readcount = serializers.IntegerField(label='阅读量', required=False)
    commentcount = serializers.IntegerField(label='评论量', required=False)
    image = serializers.ImageField(label='图片', required=False)
    peopleinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) # 新增

    def create(self, validated_data):
    """新建"""
    return BookInfo.objects.create(**validated_data)

    def update(self, instance, validated_data):
    """更新,instance为要更新的对象实例"""
    instance.name = validated_data.get('name', instance.name)
    instance.pub_date = validated_data.get('pub_date', instance.pub_date)
    instance.readcount = validated_data.get('readcount', instance.readcount)
    instance.commentcount = validated_data.get('commentcount', instance.commentcount)
    instance.save()
    return instance

    • 实现了上述两个方法后,在反序列化数据的时候,就可以通过save()方法返回一个数据对象实例了

      • serializer.save()
      • 如果创建序列化器对象的时候,没有传递instance实例,则调用save()方法的时候,create()被调用,相反,如果传递了instance实例,则调用save()方法的时候,update()被调用。

XMind: ZEN - Trial Version

Django1.11序列化与反序列化的更多相关文章

  1. Django1.11 的serializers序列化model

    开发环境:Django1.11  Python3 如果想把很多model转化成json格式可以直接这样写: from django.views.generic.base import View fro ...

  2. DRF框架(三)——media资源路径设置、多表设计复习及补充、序列化组件(ModelSerializer)操作多表(序列化与反序列化)、多表序列化与反序列化整合(重点)

    media资源路径设置  (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/me ...

  3. ModelSerializer,序列化与反序列化整合

    复习 """ 1.解析模块:全局局部配置 REST_FRAMEWORK = { # 全局解析类配置 'DEFAULT_PARSER_CLASSES': [ 'rest_f ...

  4. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  5. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  6. 序列化,反序列化和transient关键字

    一.序列化和反序列化的概念 序列化:指把java对象转换为字节序列的过程. 反序列化:指把字节序列恢复为java对象的过程. 对象的序列化主要有两种用途: 1) 把对象的字节序列保存到硬盘上,通常存放 ...

  7. C#对象序列化与反序列化zz

      C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...

  8. [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类

    [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...

  9. XmlSerializer 对象的Xml序列化和反序列化

    http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html 这篇随笔对应的.Net命名空间是System.Xm ...

随机推荐

  1. POJ 1905:Expanding Rods 求函数的二分

    Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13780   Accepted: 3563 D ...

  2. 13.swoole学习笔记--DNS查询

    <?php //执行DNS查询 swoole_async_dns_lookup("www.baidu.com",function($host,$ip){ echo $ip; ...

  3. 一百零五、SAP中ALV事件之十七,让ALV表格修改后保存到数据库

    一.我们来到代码界面设置保存按钮的代码 二.i_grid_settings这个属性用来编辑单元格之后,返回给程序编辑后的值 三.我们双击点  'REUSE_ALV_GRID_DISPLAY',来到定义 ...

  4. Docker部署Python应用程序

    Docker部署Python应用程序 1. 单个py文件部署 生成Dockerfile 文件 插件用的豆瓣的镜像,,重置时间(容器的默认时间是UTC时间与宿主机的相差8小时). 文中需要三个插件(pe ...

  5. sed -i添加到第一行

    用sed的i\命令在第一行前面插入即可,加上 -i 选项直接操作文件. sed -i '1i\要添加的内容' yourfile 查看插入第一行是否成功 sed -n '1,1p' yourfile

  6. CGridCtrl显示图片

  7. 并发 ping

    参考 [root@RS2 ~]# cat .sh #!/bin/bash # --, by wwy #------------------------------------------------- ...

  8. 浅谈__slots__

    __slots__在python中是扮演属性声明(Attribute Declaration)的角色,当然属性本身不用声明,只需要在使用前赋值即可,但是实际上,属性的应用远非在使用前赋值就行,所以有a ...

  9. ACM&OI 基础数论算法专题

    ACM&OI 基础数学算法专题 一.数论基础 质数及其判法 (已完结) 质数的两种筛法 (已完结) 算数基本定理与质因数分解 (已完结) 约数与整除 (已完结) 整除分块 (已完结) 最大公约 ...

  10. 《机实战》第2章 K近邻算法实战(KNN)

    1.准备:使用Python导入数据 1.创建kNN.py文件,并在其中增加下面的代码: from numpy import * #导入科学计算包 import operator #运算符模块,k近邻算 ...