一、模型类序列化器ModelSerializer
如果我们想要使用序列化器对应的是Django的模型类,DRF提供了ModelSerializer模型类序列化器来帮助我们快速创建一个序列化器。
位置:rest_framework.serializers.ModelSerializer
,
继承:Serializer
ModelSerializer
提供了如下功能,用法与Serializer相同:
- 基于模型类自动生成一系列字段
- 基于模型类自动为Serializer生成validators,比如unique_together
- 包含默认的create()和update()的实现
(一)定义
比如我们创建一个BookInfoSerializer:
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo # 指明参照哪个模型类
fields = '__all__' # 指明为模型类所有字段生成
(二)Meta参数
2. 指定字段fields参数
(1)指定所有字段都映射到序列化器中
fields = '__all__'
(2)具体指明字段(元组或者列表类型)
fields = ('id', 'btitle', 'bpub_date')
(3)使用exclude排除掉字段
exclude = ('image',)
(4)显示指明字段
fields = ('id', 'hname', 'hgender', 'hcomment', 'hbook')
3.read_only_fields参数
- read_only_fields指明只读字段,即仅用于序列化输出的字段
read_only_fields = ('id', 'bread', 'bcomment')
3. 添加额外参数
extra_kwargs参数
为ModelSerializer添加或修改原有的选项参数
class BookInfoSerializer(serializers.ModelSerializer):
"""图书数据序列化器"""
class Meta:
model = BookInfo
fields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')
extra_kwargs = {
'bread': {'min_value': 0, 'required': True},
'bcomment': {'min_value': 0, 'required': True},
}
4.主键序列化处理
ModelSerializer会默认使用主键
作为关联字段
用depth来简单的生成嵌套表示,depth应该是整数,表明嵌套的层级数量
class HeroInfoSerializer2(serializers.ModelSerializer):
class Meta:
model = HeroInfo
fields = '__all__'
depth = 1
用django交互环境测试:
>>> from booktest.serializers import HeroInfoModelSerializer
>>> HeroInfoModelSerializer()
HeroInfoSerializer():
id = IntegerField(label='ID', read_only=True)
hname = CharField(label='名称', max_length=20)
hgender = ChoiceField(choices=((0, 'male'), (1, 'female')), label='性别', required=False, validators=[<django.core.validators.MinValueValidator object>, <django.core.validators.MaxValueValidator object>])
hcomment = CharField(allow_null=True, label='描述信息', max_length=200, required=False)
is_delete = BooleanField(label='逻辑删除', required=False)
hbook = NestedSerializer(read_only=True):
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)