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

 

posted @ 2020-09-17 20:02  亦木121  阅读(190)  评论(0)    收藏  举报