DRF学习笔记(三):模型类序列化器ModelSerializer


前言

当我们有很多个模型的时候,为每个模型编写一个对应的序列化器,将会非常不方便。DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。

ModelSerializer与常规的Serializer相同,但提供了:

(1)基于模型类自动生成一系列字段
(2)基于模型类自动为Serializer生成validators,比如unique_together
(3)包含默认的create()和update()的实现

一、ModelSerializer使用

1、在demo/serializers下修改ClassInfoSerializer

class ClassInfoSerializer(serializers.ModelSerializer):
    """班级数据序列化器"""
    # id = serializers.IntegerField(label='ID', read_only=True)
    # number = serializers.IntegerField(label='班级编号', required=False)
    # grade = serializers.CharField(label='年级', max_length=3, required=False)
    # studentinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True)  # 添加
    class Meta:
        model = ClassInfo
        fields = '__all__'

结果:

>>> from demo.serializers import ClassInfoSerializer
>>> serializer = ClassInfoSerializer()
>>> serializer
ClassInfoSerializer():
    id = IntegerField(label='ID', read_only=True)
    number = IntegerField(label='班级编号', max_value=2147483647, min_value=-2147483648)
    grade = ChoiceField(choices=(('一年级', '一年级'), ('二年级', '二年级'), ('三年级', '三年级')), label='年级')

二、指明字段

1、使用fields来明确字段,__all__表名包含所有字段,也可以写明具体哪些字段,如:

class ClassInfoSerializer(serializers.ModelSerializer):
    """班级数据序列化器"""
    class Meta:
        model = ClassInfo
        fields = ('number', 'grade')

结果:

>>> from demo.serializers import ClassInfoSerializer
>>> serializer = ClassInfoSerializer()
>>> serializer
ClassInfoSerializer():
    number = IntegerField(label='班级编号', max_value=2147483647, min_value=-2147483648)
    grade = ChoiceField(choices=(('一年级', '一年级'), ('二年级', '二年级'), ('三年级', '三年级')), label='年级')

2、使用exclude可以明确排除掉哪些字段:

class ClassInfoSerializer(serializers.ModelSerializer):
    """班级数据序列化器"""
    class Meta:
        model = ClassInfo
        exclude = ('id',)

结果:

>>> from demo.serializers import ClassInfoSerializer
>>> serializer = ClassInfoSerializer()
>>> serializer
ClassInfoSerializer():
    number = IntegerField(label='班级编号', max_value=2147483647, min_value=-2147483648)
    grade = ChoiceField(choices=(('一年级', '一年级'), ('二年级', '二年级'), ('三年级', '三年级')), label='年级')

3、默认ModelSerializer使用主键作为关联字段,但是我们可以使用depth来简单的生成嵌套表示,depth应该是整数,表明嵌套的层级数量。如:

class StudentInfoSerializer(serializers.ModelSerializer):
    """学生数据序列化器"""
    class Meta:
        model = StudentInfo
        fields = '__all__'
        depth = 1

没有层级结果:

>>> from demo.serializers import StudentInfoSerializer
>>> serializer = StudentInfoSerializer()
>>> serializer
StudentInfoSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(label='姓名', max_length=10)
    sex = ChoiceField(choices=(('男', '男'), ('女', '女')), label='性别')
    from_class = PrimaryKeyRelatedField(queryset=ClassInfo.objects.all())

有层级结果:

>>> from demo.serializers import StudentInfoSerializer
>>> serializer = StudentInfoSerializer()
>>> serializer
StudentInfoSerializer():
    id = IntegerField(label='ID', read_only=True)
    name = CharField(label='姓名', max_length=10)
    sex = ChoiceField(choices=(('男', '男'), ('女', '女')), label='性别')
    from_class = NestedSerializer(read_only=True):
        id = IntegerField(label='ID', read_only=True)
        number = IntegerField(label='班级编号', max_value=2147483647, min_value=-2147483648)
        grade = ChoiceField(choices=(('一年级', '一年级'), ('二年级', '二年级'), ('三年级', '三年级')), label='年级')

三、添加额外参数

我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数:

class ClassInfoSerializer(serializers.ModelSerializer):
    """班级数据序列化器"""
    class Meta:
        model = ClassInfo
        exclude = ('id',)
        extra_kwargs = {
            'number': {'min_value': 0}

结果:

>>> from demo.serializers import ClassInfoSerializer
>>> serializer = ClassInfoSerializer()
>>> serializer
ClassInfoSerializer():
    number = IntegerField(label='班级编号', max_value=2147483647, min_value=0)
    grade = ChoiceField(choices=(('一年级', '一年级'), ('二年级', '二年级'), ('三年级', '三年级')), label='年级')

序列化内容就讲完了,下一章将会讲DRF的视图内容
下一章:DRF学习笔记(四):DRF视图

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值