引入:
- 自定义的序列化器需要我们自己去手动创建每一个字段(太繁琐),模型类序列化器可以帮助我们省去这个繁琐步骤
模型类序列化器帮助我们完成了2件事:
(1)、根据指定的规则,自动映射字段参与序列化/反序列化;
(2)、重写了create
和update
方法实现模型类对象的新建和更新逻辑;
"""
模型类序列化器
serializers.ModelSerializer: 模型类序列化器基类
"""
"""
模型类序列化器
serializers.ModelSerializer: 模型类序列化器基类
"""
from rest_framework import serializers
from .models import *
# 自定义校验一
def check_btitle(value):
if 'django' not in value:
raise serializers.ValidationError('这不是一本关于django的书')
class BookInfoModelSerializer(serializers.ModelSerializer):
class Meta:
model = BookInfo # 潜台词:将来新建或更新的是BookInfo模型类
# 1.自动映射字段(隐藏的主键字段也会自动映射,非主键的隐藏字段不会
fields = "__all__"
# 2.显示声明参与序列化/反序列化的字段
# fields = ['btitle', 'bpub_date', 'heros']
# 3.排除指定字段,把其他字段映射过来参与序列化/反序列化
# exclude = ['btitle', 'bpub_date']
# 4.调整字段的约束条件(模型类序列化器映射的字段有些值不符合业务)
extra_kwargs = {
'bread': {'min_value': 0},
'bcomment': {'min_value': 0},
'btitle': {'validators': [check_btitle]}
}
# 5.设置read_only = True的字段(只作用于序列化操作)
# read_only_fields = ['id', 'btitle']
终端测试:
- 类名
BookInfoModelSerializer()
可以查看自动映射的字段
>>> from books_test.serializers import *
>>> BookInfoModelSerializer()
BookInfoModelSerializer():
id = IntegerField(label='ID', read_only=True)
btitle = CharField(label='名称', max_length=20)
bpub_date = DateField(label='发布日期')
bread = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)
bcomment = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
image = ImageField(allow_null=True, label='图片', max_length=100, required=False)
- 测试新建(和自定义的序列化器方法一样):
>>> from books_test.serializers import*
>>> book_info = {'btitle': 'django从入门到上瘾', 'bpub_date': '2005-6-6'}
>>> bs = BookInfoModelSerializer(data=book_info)
>>> bs.is_valid()
True
>>> bs.save()
<BookInfo: django从入门到上瘾>
>>>