Django之DRF框架学习(Django REST framework)—— 序列化与反序列化

一:简介

  1. 将请求的数据(例如Json格式)转换成模型类对象(反序列化)
  2. 将模型类对象转换为响应的数据(如Json格式)(序列化)

二:定义序列化器

  • 模型与序列化器代码
  1. models.py (模型)
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')
    bread = models.IntegerField(default=0, verbose_name='阅读量')
    bcomment = models.IntegerField(default=0, verbose_name='评论量')
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
  1. serializers.py (序列化器)
class BookInfoSerializer(serializers.Serializer):
    '''定义序列化器'''
    # class Meta:
    #     model = BookInfo   #指定序列化从那个模型映射字段
    #     fields = '__all__'  #映射哪些字段
    #read_only=True 只做序列化  write_only=True只做反序列化,但是两个不可以都写。两个都不写的话,两个默认都是False,代表是双向的既可以输入也可以输出
    id = serializers.IntegerField(label='ID', read_only=True)
    #required=True表示这个字段必须传,不写的话默认为True, required=False表示可以不传
    btitle = serializers.CharField(max_length=20, label='名称', required=True)
    bpub_date = serializers.DateField(label='发布日期')
    bread = serializers.IntegerField(label='阅读量')
    bcomment = serializers.IntegerField(label='评论量')
    is_delete = serializers.BooleanField(label='逻辑删除')

#read_only=True 只做序列化 write_only=True只做反序列化,但是两个不可以都写。两个都不写的话,两个默认都是False,代表是双向的既可以输入也可以输出
#required=True表示这个字段必须传,不写的话默认为True, required=False表示可以不传

注:(选项参数,如下两个图片来源b站播主——Believess的视频截取)
在这里插入图片描述
在这里插入图片描述

三:创建Serializer对象

定义好Serializer类就可以创建对象了,Serializer的构造方法为

Serializer(instance=None, data=empty, **kwarg)

说明:

  1. 用于序列化时,将模型类对象传入instance参数
    2)用于反序列化时,将要被反序列化的数据传入data参数
    3)除了instance和data参数外,在构造Serializer对象时,还可以通过context参数额外添加数据,如:
    serializer = AccountSerializer(account, context={‘request’: request})

通过context参数附加的数据,可以通过Serializer对象的context属性获取

四:序列化的具体操纵

在django shell中使用ipython

python manage.py shell

  1. 基本使用
    (1)先查询出一个图书对象

    from booktest.models import BookInfo
    book = BookInfo.objects.get(id=7)

    (2)构造序列化器对象

    from booktest.serializers import BookInfoSerializer
    serializer = BookInfoSerializer(book)

    (3) 获取序列化数据

    serializer.data #通过data属性可以获取序列化后的数据

    (4)如果被序列化的是包含多条数据的查询集QuerySet,可以通过添加 many=True参数补充说明

    book_qs = BookInfo.objects.all()
    serializer = BookInfoSerializer(book_q, many=True)
    serializer.data

  2. 关联对象嵌套序列化

    如果需要序列化的数据包含有其他关联对象,则对关联对象数据的序列化需要指明
    例如: 在定义英雄数据的序列化时,外键hbook字段如何序列化

class HeroInfoSerializer(serializers.Serializer):
    GENDER_CHOICES = (
        (0, 'female'),
        (1, 'male')
    )

    id = serializers.IntegerField(label='ID', read_only=True)
    hname = serializers.CharField(max_length=20, label='名称')
    hgender = serializers.ChoiceField(choices=GENDER_CHOICES, required=False, label='性别')
    hcomment = serializers.CharField(max_length=200, allow_null=True, label='描述信息', required=False)
    
    # hbook = serializers.PrimaryKeyRelatedField(label='书籍', read_only=True) #默认将关联模型的id序列化
    # hbook = serializers.StringRelatedField(label='书籍', read_only=True) #默认将关联模型的__str__方法返回值
    # hbook = BookInfoSerializer()  #关联模型对象的序列化器中所有字段序列化出来

(1) PrimaryKeyRelatedField

包含read_only=True参数时,该字段不能用做反序列化操作
包含queryset参数时,将被用作反序列化时参数校验使用

hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)
hbook = serializers.PrimaryKeyRelatedField(label='图书', queryset=BookInfo.objects.all())

(2)StringRelatedField
此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)

hbook = serializers.StringRelatedField(label=‘图书’)

(3)使用关联对象的序列化器

hbook = BookInfoSerializer()

五:反序列化的具体操作

  1. 验证
    使用序列化器进行反序列化的时候,需要对数据进行验证后,才可以获取验证成功的数据,或者保存成模型类的对象。
    使用is_valid()方法进行验证, 验证成功返回True,可以通过validated_data属性获取数据,失败返回False可以通过序列化器的errors属性,返回字典,包含了字段和字段的错误,如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERROES_KEY来控制错误字典中的键名。
    在定义序列化器时,指明每个字段的序列化类型和选项参数,本身就是一种验证行为。
    定义BookInfoSerializer
class BookInfoSerializer(serializers.Serializer):
    '''定义序列化器'''
   
    #read_only=True 只做序列化  write_only=True只做反序列化,但是两个不可以都写。两个都不写的话,两个默认都是False,代表是双向的既可以输入也可以输出
    id = serializers.IntegerField(label='ID', read_only=True)
    #required=True表示这个字段必须传,不写的话默认为True, required=False表示可以不传
    # validators里面是一个校验的函数,多个字段都可以通过此属性进行校验
    btitle = serializers.CharField(max_length=20, label='名称', required=True)
    bpub_date = serializers.DateField(label='发布日期')
    bread = serializers.IntegerField(label='阅读量', required=False)
    bcomment = serializers.IntegerField(label='评论量', required=False)
    is_delete = serializers.BooleanField(label='逻辑删除', required=False)

通过构造序列化器对象,并将要反序列化的数据传递给data构造参数,进而进行验证

data = {
    'btitle' : '三国',
    'bpub_date' : '1999-04-23'
}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()   #调用序列化器的校验方法  True或者False
serializer.is_vaild(raise_exception=True) #指定了raise_exception=True的话,校验出错的话自动抛出异常
serializer.errors  # 获取校验的错误信息
serializer.validated_data #获取反序列化校验后的数据还是字典

六:模型类序列化器ModelSerializer

如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serialzer类。
ModelSerializer与常规的Serializer相同,但是提供了:
(1) 基于模型类自动生成一些列字段
(2) 包含默认的create()与update()的实现

  • 创建BookInfoSerializer类
  • model : 指明参照那个模型
  • fields : 指明为模型类的哪些字段生成
from rest_framework import serializers
class BookInfoSerializer(serializers.ModelSerializer):
    '''定义序列化器'''
    class Meta:
        model = BookInfo   #指定序列化从那个模型映射字段
        fields = '__all__'  #映射哪些字段

谢谢观看本期内容~
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值