ModelSerializer序列化器
一、自动生成序列化器类
前面说的那种序列化器,整个序列化器类都要自己写,代码和model类高度相似,于是就有了ModelSerializer序列化器,可以自动生成序列化器类。
1.1 自动生成序列化器类
# 自动生成需继承serializers.ModelSerializer
class ProjectModelSerializer(serializers.ModelSerializer):
class Meta:
# model指定用哪一个类生成序列化器类
model = Projects
# fields指定模型类中需要进行序列化操作的字段,如果指定了模型类中没有定义的字段,那么必须在fields元组中指定,如果fields为'__all__'或者exclude除外
# '__all__',指定模型类中所有的字段都需要进行序列化操作
# fields = '__all__'
# 可以指定模型类中序列化操作的字段,需要在元组中指定
# fields = ('id', 'name', 'leader', 'is_execute')
fields = ('id', 'name', 'leader', 'is_execute', 'interfaces', 'token', 'email')
# exclude指定不需要进行序列化操作的字段(如果元祖只有一个元素,后面要加逗号)
# exclude = ('create_time', 'update_time', 'is_execute')
# 可以在Meta内部类的read_only_fields,统一指定需要添加read_only=True的字段
read_only_fields = ('is_execute', 'desc', 'id')
ModelSerializer特点:
- 继承ModelSerializer,根据模型类来自动生成序列化器类中的字段
- 必须得指定model参数(模型类),用于指定使用的模型
- 会实现create、update方法
如果不需要对数据进行特殊操作就不需要重写这两个方法,如果有特殊处理,例如调用save()方法的时候传了关键字参数,那么重写这两个方法,pop掉多余的参数后,调用父类的对应方法。 - 会给主键字段、DataTimeField(指定auto_now_add和auto_now参数),会添加read_only=True
- 会给有指定default参数的字段,添加required=False
- 会给有指定null参数的字段,添加allow_null=True
- 会给有指定blank参数的字段,添加allow_blank=True
二、修改自动生成的字段信息
2.1.1 方式一
重新定义模型类中的字段,需注意的是,这里需要把参数写全,因为重新定义该字段后会覆盖自动生成的同名字段。
class ProjectModelSerializer(serializers.ModelSerializer):
name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=10, min_length=3,
error_messages={
'min_length': '项目名称不能少于3位', 'max_length': '项目名称不能超过10位'},
validators=[
UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
is_contain_keyword
])
2.1.2 方式二
可以在Meta内部类的extra_kwargs中对自动生成的序列化字段进行修改(此处的修改只能针对模型类中有的字段,不支持修改自己在序列化器类中自己添加的字段),将需要修改的字段名作为key,具体修改的内容作为value。此方式不会覆盖自动生成的同名字段,只是在自动生成的参数后追加参数或修改参数。
class ProjectModelSerializer(serializers.ModelSerializer):
class Meta:
...
extra_kwargs = {
'name': {
'label': '项目名称',
'max_length': 10,
'min_length': 3,
'error_messages': {
'min_length': '项目名称不能少于3位',
'max_length': '项目名称不能超过10位'
},
'validators': [
UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
is_contain_keyword
],
'write_only': True
}
}