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='逻辑删除')
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(instance=None, data=empty, **kwarg)
说明:
- 用于序列化时,将模型类对象传入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)先查询出一个图书对象
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
关联对象嵌套序列化
如果需要序列化的数据包含有其他关联对象,则对关联对象数据的序列化需要指明
例如: 在定义英雄数据的序列化时,外键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()
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 #获取反序列化校验后的数据还是字典
如果我们想要使用序列化器对应的是Django的模型类,DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serialzer类。
ModelSerializer与常规的Serializer相同,但是提供了:
(1) 基于模型类自动生成一些列字段
(2) 包含默认的create()与update()的实现
from rest_framework import serializers
class BookInfoSerializer(serializers.ModelSerializer):
'''定义序列化器'''
class Meta:
model = BookInfo #指定序列化从那个模型映射字段
fields = '__all__' #映射哪些字段