您的当前位置:首页DRF框架之Serializer序列化器的序列化操作

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

来源:小侦探旅游网
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数据

Shell测试代码如下:

>>> from booktest.models import BookInfo

>>> from booktest.serializers import BookInfoSerializer>>> book = BookInfo.objects.get(id=2)>>> book

>>> 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

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

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序列化器的序列化操作就讲完啦。那么,接下来我们就要进⾏反序列化操作的店铺。

因篇幅问题不能全部显示,请点此查看更多更全内容