前言
当我们有很多个模型的时候,为每个模型编写一个对应的序列化器,将会非常不方便。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视图