Django之serializer-ModelSerializer
程序员文章站
2022-06-28 18:42:44
一. 模型序列化器和普通序列化器对比没有使用ModelSerializer序列化器时,我们自定义的序列化器类需要添加对应模型类中的很多字段,但是如果添加的字段有成百个,是否也需要一个一个手动添加呢?所以有一种更为简洁的模型序列化器类来帮我们优化框架代码,简化序列化器类中字段的创建普通序列化器类示例:在这里插入代码片......
一、模型序列化器和普通序列化器对比
没有使用ModelSerializer序列化器时,我们自定义的序列化器类需要添加对应模型类中的很多字段,但是如果添加的字段有成百个,是否也需要一个一个手动添加呢?所以有一种更为简洁的模型序列化器类来帮我们优化框架代码,简化序列化器类中字段的创建
普通序列化器类示例:
class ProjectsSerializer(serializers.Serializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',validators=[ validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
leader = serializers.CharField(max_length=200, label='项目负责人', help_text='项目负责人帮助文档')
tester = serializers.CharField(max_length=200, label='测试人员', help_text='测试人员帮助文档',
error_messages={"required": "tester该字段必传", "max_length": "长度不能操作5个字节"})
使用模型序列化器类(ModelSerializer)如下:
class ProjectsModelSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = '__all__'
可以看见,已经简化很多,规则总结如下:
- 需要在Meta类中使用model类属性来指定需要按照哪一个模型类来创建
- fields类属性指定模型类中哪些字段需要输入或输出
- 默认id主键会添加read_only=True
- create_time和update_time会默认添加read_only=True
- ModelSerializer类中自带的有create和update方法,无需重写即可生效
二、使用方法
直接使用ModelSerializer实例化的对象替换掉原先的序列化器类对象
class IndexPageView(View):
def get(self, request):
"""
get请求,请求所有数据,未分页
:param request:
:return:
"""
qs = Project.objects.all()
# ser_obj = ProjectsSerializer(instance=qs, many=True)
ser_obj = ProjectsModelSerializer(instance=qs, many=True)
return JsonResponse(ser_obj.data, status=200, safe=False)
三、反序列化校验
1.默认全部字段输出或输入
在Meta子类中定义类属性fields=‘all’
fields = '__all__'
2.指定需要输出或输入的字段
在Meta子类中定义类属性fields=(字段1,字段2,…)
fields = ('id', 'name', 'leader', 'tester','email')
3.排除不需要输出或输入的字段
在Meta子类中定义类属性exclude=(字段1,字段2,…)
exclude = ('desc',)
4.只允许序列化输出
在Meta子类中定义类属性read_only_fields=(字段1,字段2,…)
read_only_fields = ('id',)
5.自定义校验规则
5-1.在ModelSerializer类中创建字段类的对象
其优先级最高,如果以该方式创建的字段很多,可以选择普通的序列化器类来定义
class ProjectsModelSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
validators=[
validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
class Meta:
model = Project
fields = ('id', 'name', 'leader', 'tester', 'email')
5-2.在Meta子类中定义extra_kwargs字段
键为字段名,值为一个字典,其中键为校验项,值为校验规则
class ProjectsModelSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
validators=[
validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
class Meta:
model = Project
fields = ('id', 'name', 'leader', 'tester')
extra_kwargs = {
'tester': {
'label': '测试负责人',
'max_length': 2
}
}
四、添加不在模型类里面而需要反序列化的字段
- 定义字段
- 添加字段名称到ModelSerializer序列化器类Meta子类的fields属性中
- 在Meta子类中重写create或者update方法
class ProjectsModelSerializer(serializers.ModelSerializer):
name = serializers.CharField(max_length=50, label='项目名称', help_text='项目名称帮助文档',
validators=[
validators.UniqueValidator(queryset=Project.objects.all(), message="项目名称已存在")])
email = serializers.EmailField(max_length=50)
class Meta:
model = Project
fields = ('id', 'name', 'leader', 'tester', 'email')
extra_kwargs = {
'tester': {
'label': '测试负责人',
'max_length': 2
}
}
def create(self, validated_data):
email = validated_data.pop('email')
return super().create(validated_data)
本文地址:https://blog.csdn.net/weixin_47454485/article/details/107354474
上一篇: css3实现边框圆角内凹效果
下一篇: 解决word发送错误报告实战经验分享