DRF框架之Serializer序列化器的序列化操作

在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer.

今天,我们就先来学习一下Serializer序列化器

使用Serializer序列化器的开发步骤:

1. 定义Serializer序列化器

首先,我们要在子应用中,创建见一个serializers.py文件,用来编写Serializer序列化器代码。

from rest_framework import serializers
# 定义序列化器


class BookInfoSerializer(serializers.Serializer):
    '''定义图书序Serializer序列化器'''
    # 这里的字段需要和模型类中的字段名、字段类型、约束一致
    id = serializers.IntegerField(label='ID', read_only=True)
    btitle = serializers.CharField(label='名称', max_length=20)
    bpub_date = serializers.DateField(label='发布日期', required=False)
    bread = serializers.IntegerField(label='阅读量', required=False)
    bcomment = serializers.IntegerField(label='评论量', required=False)

2. 使用序列化器对数据进行操作。

既然,说到要对数据进项操作,那么,可想而知,就一定分为序列化和反序列化两种操作。

首先呢,我们先来明确一下什么叫做序列化操作?

序列化操作:模型数据 --> 字典数据 --? JOSN数据

序列化操作:

 单个模型数据的序列化操作:序列化器名称(instance='模型数据')

 查询集模型数据的序列化操作:序列化器名称(instance='模型数据集', many=True)  ---> many的意思就是告诉序列化器这是一个查询集。

Shell测试代码如下:

>>> from booktest.models import BookInfo
>>> from booktest.serializers import BookInfoSerializer
>>> book = BookInfo.objects.get(id=2)
>>> book
<BookInfo: 天龙八部>
>>> s = BookInfoSerializer(instance=book)
>>> s.data
{'bread': 36, 'btitle': '天龙八部', 'bpub_date': '1986-07-24', 'id': 2, 'bcomment': 40}
>>> books = BookInfo.objects.all()
>>> s = BookInfoSerializer(instance=books, many=True)
>>> s.data
[OrderedDict([('id', 1), ('btitle', '射雕英雄传'), ('bpub_date', '1980-05-01'), ('bread', 12), ('bcomment', 34)]), OrderedDict([('id', 2), ('btitle龙八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40)]), OrderedDict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24read', 20), ('bcomment', 80)]), OrderedDict([('id', 4), ('btitle', '雪山飞狐'), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24)]), OrdDict([('id', 9), ('btitle', '西游记'), ('bpub_date', '2020-02-05'), ('bread', 18), ('bcomment', 7)])]

关联对嵌套序列化:

多对一嵌套序列化操作:在序列化多关系模型数据时,也要将一关系模型数据序列化出来。

首先,我们需要定义一个多关系模型的序列化器。

class HeroInfoSerializer(serializers.Serializer):
    """英雄数据序列化器"""

    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    id = serializers.IntegerField(label='ID', read_only=True)
    hname = serializers.CharField(label='名字', max_length=20)
    hgender = serializers.ChoiceField(label='性别', choices=GENDER_CHOICES, required=False)
    hcomment = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)

因为,我们要进行嵌套序列化操作,所以,需要在多关系模型中补充对一关系模型的关联字段。

其中,分为以下三种情况:

1. 使用外键id作为关联(serializers.PrimaryKeyRelatedField):在多模型数据序列化时,会将对应的一关系模型数据的主键id序列化出来。

2. 使用一关系模型类中的str方法做关联(serializers.StringRelatedField):表示使用一模型类中的__str__方法的返回值作为关联,序列化出来的数据是多关系模型序列化后的数据str方法的返回值。(几乎不被使用)

3. 使用一关系模型类的序列化器做关联(BookInfoSerializer()):在多关系模型数据序列化时,会将对应的一关系模型数据全部序列化出来

需要,在多关系模型序列化器中补充的代码如下:

    # 补充多对一查询关联字段
    # PrimaryKeyRelatedField:表示当前表中的外键,通过这种方式序列化出来的为外键ID
    hbook = serializers.PrimaryKeyRelatedField(read_only=True, label='主键')

    # StringRelatedField:表示使用模型类中的__str__方法,返回的值作为关联,序列化出来的数据是str方法的返回值
    hbook = serializers.StringRelatedField(read_only=True, label='图书')

    # BookInfoSerializer:以关联模型类的序列化器作为关联,序列化出来的数据是关联对象的所有数据
    hbook = BookInfoSerializer()
一对多的嵌套序列化操作:在序列化一关系模型数据时,将多关系模型的数据也序列化出来。

我们已经在上面定义过了一个一关系模型的序列化器了,我们直接复用就可以。

同样,我们也需要对一关系模型序列化器中补充一关系模型对多关系模型的关联字段。

其中,和多对一序列化一样,也是分为种情况(但是,我们只需要记住使用外键id作为关联字段即可):

使用外键id作为关联(serializers.PrimaryKeyRelatedField):在一模型数据序列化时,会将对应的多关系模型数据的主键id序列化出来。

需要,在一关系模型序列化器中补充的代码如下:

    # 补充一对多关联对象序列化字段
    # 多方类名小写_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True),序列化的是关联对象的id
    heroinfo_set = serializers.PrimaryKeyRelatedField(label='英雄',read_only=True, many=True)

至此,我们的Serializer序列化器的序列化操作就讲完啦。

那么,接下来我们就要进行反序列化操作的学习啦。

该花的钱要花,该吃的饭要吃。
原文地址:https://www.cnblogs.com/chao666/p/12269967.html