本文转载自微信公众号「AirPython」,作者星安果。转载本文请联系AirPython公众号。
1. 前言
大家好,我是安果!
接下来,将通过几篇文章将对 DRF 模型序列化进行展开说明,详情谈谈模型序列化的作用、步骤及进阶用法
2. 模型序列化的作用?
作为 DRF 中非常关键的一步,模型序列化主要作用有 3 个
- 序列化数据
用于将模型序列化成 JSON 格式的对象,便于数据返回
- 表单验证
在表单请求中,用于验证用户上传的数据是否满足项目要求
- 数据操作
可用于数据更新、数据创建、数据保存等
3. 表单字段验证
指定需要序列化的字段时,可以设置字段类型、默认值、可读或可写、验证错误提示信息等,然后针对表单字段进行验证
表单字段验证同样有 3 种方式,分别对应:
3-1 序列化字段,使用参数形式进行制定
比如,字段 name 数据类型为字符串,max_length 指定最大长度,必须输入,并使用「 error_messages 」设置验证失败的提示信息
- # 最大长度50
- # required=True:必须输入
- # 如果不传递,则报错:name必须要传递
- name = serializers.CharField(max_length=50, required=True, error_messages={"required": "name必须要传递"})
3-2 重写 validate( self , attrs ) 方法进行验证
参数 attrs 包含所有字段
我们只需要自定义验证逻辑,如果验证不通过,抛出「 serializers.ValidationError 」异常即可
比如,这里验证 name 中必须包含关键字「 深圳 」,否则抛出异常(代表验证失败)
- def validate(self, attrs):
- """
- 表单数据验证
- :param attrs:
- :return:
- """
- print(attrs)
- if "深圳" not in attrs.get("name"):
- raise serializers.ValidationError('名称中没有包含【深圳】,验证失败!')
- return attrs
3-3 重写 validate_字段名(self,value) 方法
单独针对某个字段进行验证
比如,我们还是对 name 字段进行验证,如果验证不通过,主动抛出「 serializers.ValidationError 」异常即可
- def validate_name(self, name):
- """
- 对name字段进行验证
- :param name:
- :return:
- """
- if "深圳" not in name:
- raise serializers.ValidationError('名称中没有包含【深圳】,验证失败!')
- return name
4. 重写创建、更新方法
创建的序列化类继承于 serializers.Serializer 类
这里重写 update() 和 create() 函数
其中,
- update( self, instance, validated_data )
用于更新数据,将参数 validated_data 中的数据更新到 instance 中
- create(self, validated_data)
validated_data 作为关键字参数,用于创建模型
- class GoodsSerializer(serializers.Serializer):
- # 需要序列化的字段
- # 注意:自动生成的字段,只会涉及读取的场景
- id = serializers.IntegerField(read_only=True)
- # error_messages:定义错误信息
- name = serializers.CharField(max_length=200, required=True, error_messages={"required": "name参数必须要传递"})
- def update(self, instance, validated_data):
- """
- 更新数据,将validated_data中的数据更新到instance中
- :param instance:
- :param validated_data:
- :return:
- """
- # 修改数据
- instance.name = validated_data.get("name", instance.name)
- # 保存更新
- instance.save()
- return instance
- def create(self, validated_data):
- """
- 创建数据
- :param validated_data:
- :return:
- """
- # Goods:模型
- return Goods.objects.create(**validated_data)
5. 最后
本章讲到模型普通序列化的步骤,关于模型序列化、序列化嵌套、项目实战中流程,我将在下一篇文章进行说明。