Modelserializer
1、Modelserializer会根据模型类自动生成字段
2、还可以手动添加字段
3、提供了反序列化时用的create方法和update方法,不需要再手动在序列化器中创建create方法
from rest_framework import serializers from app.models import BookInfo class BookModelSerializer(serializers.ModelSerializer): #手动添加字段 mobile = serializers.CharField(max_length=11,label='手机号') class Meta: model = BookInfo #参考模型类生成字段 fields = "__all__" #生成所有字段
1)这里使用fields生成了所有的字段
也可以使用fields生成指定的字段,可以使用列表或者元组
fields=['btitle',bcomment]
2)还可以设置只读字段,如下
read_only_fields=['btitle',bcomment]
3) extra_kwargs
可以使用extra_kwargs,给生成的字段添加选项约束。
模型类序列化器的字段选项约束是自动生成的,有时候不能满足我们的要求,如下,评论量不可能为负值

所以使用extra_kwargs指定约束,格式是字典,如下

-----------------------------------------------------------------------------------------------------------------------
使用模型类序列化器,测试序列化
from app.models import BookInfo from app.serializers import BookModelSerializer book = BookInfo.objects.get(id=1) book.mobile = '13888888888' serializer = BookModelSerializer(instance=book) serializer.data
注意:因为模型序列化器手动添加了字段mobile,而模型类没有该字段
所以需要增加book.mobile='xxxxx',否则会报错

手动添加字段的意义及应用场景:比如手机验证码的验证 ,数据库里肯定没有验证码这个字段,但是需要对验证码和手机校验,则需要手动添加验证码的字段
另外模型序列化手动添加的字段,还可以增加如下属性
mobile = serializers.CharField(max_length=11,label='手机号',write_only='True')
增加write_only后,表明该字段只反序列化,而不需要序列化。但是还是解决不了问题,还会出问题,所以暂时别用这个
-----------------------------------------------------------------------------------------------------------------------
使用模型类序列化器,反序列化测试,创建数据
#1准备数据,2序列化,3校验,4入库 from app.serializers import BookModelSerializer book_dict = { 'btitle':'鹿鼎记', 'bpub_date':'1999-01-01', 'bread':10, 'bcomment':5 } serializer = BookModelSerializer(data=book_dict) serializer.is_valid(raise_exception=True) serializer.save()
使用模型类序列化器,反序列化测试,更新数据
#模型类序列化器 ,反序列化,更新一条数据 from app.models import BookInfo from app.serializers import BookModelSerializer #1获取数据,获取对象2反序列化3验证4入库 book_dict = { 'btitle':'鹿鼎记x', 'bpub_date':'1999-01-01', 'bread':100, 'bcomment':50 } book = BookInfo.objects.get(id=2) serializer = BookModelSerializer(instance=book,data=book_dict) serializer.is_valid(raise_exception=True) serializer.save()

浙公网安备 33010602011771号