模型类序列化器
- DRF提供了模型类序列化器:
ModelSerializer
- 作用: 简化对应django模型类的序列化器的定义
ModelSerializer与常规的Serializer相同,但提供了:
- 基于模型类自动生成一系列字段
- 基于模型类自动为 Serializer 生成 validators,比如字段唯一的校验器
- 包含默认的 create() 和 update() 的实现
1. 定义
比如我们创建一个 DepartmentSerializer2
class DepartmentSerializer2(serializers.ModelSerializer):
class Meta:
model = Department
fields = '__all__' # 包含模型类中所有的字段
- model 指明参照哪个模型类
- fields 指定序列化器中的属性有哪些 (可以是模型类中的字段,也可以模型类中没有的但需要校验的属性,比如类似:短信验证码,确认密码)
在 python console
交互环境中,查看生成的序列化器
>>> s = DepartmentSerializer2()
>>> s
DepartmentSerializer2():
id = IntegerField(label='ID', read_only=True)
name = CharField(label='部门名称', max_length=20)
create_date = DateField(label='成立时间')
is_delete = BooleanField(label='是否删除', required=False)
2. 指定字段
1) fields
属性:指定序列化器中包含哪些字段,如下:
class DepartmentSerializer2(serializers.ModelSerializer):
class Meta:
model = Department
fields = ('id', 'name')
2) exclude
属性:排除掉模型类中指定的字段
class DepartmentSerializer2(serializers.ModelSerializer):
class Meta:
model = Department
exclude = ('is_delete',) # 注意:`exclude`不能与`fields`同时使用
3) 指明只读字段
可以通过 read_only_fields
指明只读字段,即 仅用于序列化输出,在反序列化时不会进行校验和修改
class DepartmentSerializer2(serializers.ModelSerializer):
class Meta:
model = Department
fields = '__all__'
read_only_fields = ('id', 'create_date') # 这些字段不能修改
4) 指定 关联属性的序列化方式
class EmployeeSerializer2(serializers.ModelSerializer):
# 1. 返回关联对象的主键
department = PrimaryKeyRelatedField(read_only=True)
# 2. 返回关联对象的字符串表示(即Department类的 __str__ 方法的返回值)
# department = StringRelatedField(read_only=True)
# 3. 返回关联对象序列化器定义的属性
# department = DepartmentSerializer(read_only=True)
class Meta:
model = Employee
fields = '__all__'
class DepartmentSerializer2(serializers.ModelSerializer):
# 名字固定: 类名小写_set
employee_set = PrimaryKeyRelatedField(read_only=True, many=True)
# employee_set = StringRelatedField(read_only=True, many=True)
# employee_set = EmployeeSerializer(read_only=True, many=True)
class Meta:
model = Department
fields = '__all__' # ok
# fields = ('id', 'name', 'employee_set') # ok
# fields = ('id', 'name') # error
3. 添加额外参数: extra_kwargs
属性
我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数
class EmployeeSerializer2(serializers.ModelSerializer):
class Meta:
model = Employee
fields = '__all__'
extra_kwargs = {
'name': {'min_length': 5, 'max_length': 20},
'age': {'min_value': 1, 'max_value': 200},
}
结果如下:
EmployeeSerializer2():
id = IntegerField(label='ID', read_only=True)
name = CharField(label='姓名', max_length=20, min_length=5)
age = IntegerField(label='年龄', max_value=200, min_value=1)
gender = ChoiceField(choices=((0, '男'), (1, '女')), label='性别', required=False,
validators=[<django.core.validators.MinValueValidator object>,
<django.core.validators.MaxValueValidator object>])
salary = DecimalField(decimal_places=2, label='工资', max_digits=8)
comment = CharField(allow_blank=True, allow_null=True, label='备注',
max_length=300, required=False)
hire_date = DateField(label='入职时间', read_only=True)
department = PrimaryKeyRelatedField(label='所属部门',
queryset=Department.objects.