在DRF框架中,有两种序列化器,一种是Serializer,另外一种是ModelSerializer.框架
今天,咱们就先来学习一下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)
既然,说到要对数据进项操做,那么,可想而知,就必定分为序列化和反序列化两种操做。ui
首先呢,咱们先来明确一下什么叫作序列化操做?spa
序列化操做:模型数据 --> 字典数据 --? JOSN数据rest
Shell测试代码以下:code
>>> 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)
由于,咱们要进行嵌套序列化操做,因此,须要在多关系模型中补充对一关系模型的关联字段。blog
其中,分为如下三种状况:开发
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(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序列化器的序列化操做就讲完啦。
那么,接下来咱们就要进行反序列化操做的学习啦。