1. 模型序列化的作用?
作为 DRF 中非常关键的一步,模型序列化主要作用有 3 个
- 序列化数据
- 表单验证
- 数据操作
2. 表单字段验证
指定需要序列化的字段时,可以设置字段类型、默认值、可读或可写、验证错误提示信息等,然后针对表单字段进行验证
表单字段验证同样有 3 种方式,分别对应:
2-1 序列化字段,使用参数形式进行制定
比如,字段 name 数据类型为字符串,max_length 指定最大长度,必须输入,并使用「 error_messages 」设置验证失败的提示信息
# 最大长度50
# required=True:必须输入
# 如果不传递,则报错:name必须要传递
name = serializers.CharField(max_length=50, required=True, error_messages={"required": "name必须要传递"})
2-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
2-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
3. 重写创建、更新方法
创建的序列化类继承于 serializers.Serializer 类
这里重写 update() 和 create() 函数
其中,
- update( self, instance, validated_data )
- create(self, 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 instancedef create(self, validated_data):
"""
创建数据
:param validated_data:
:return:
"""
# Goods:模型
return Goods.objects.create(**validated_data)
最近整理了几百 G 的 Python 学习资料,包含新手入门电子书、教程、源码等等,免费分享给大家!想要的前往 “Python 编程学习圈”,发送 “J” 即可免费获得
文章图片
推荐阅读
- python|Sqoop的工作原理
- Django|Python后端---使用Django+Mysql搭建一个简单的网站
- python爬虫|高清!手把手教你Python爬取LOL英雄皮肤套图
- python|打造最全皮肤,Python采集英雄联盟(LOL)官网数据!(附源码)
- Python自动化操作sqlite数据库
- 测试开发|测试开发---自动化测试中的UI测试
- 5 分钟,快速入门 Python JWT 接口认证
- yolo系列|yolov5-5.0加入CBAM,SE,CA,ECA注意力机制
- 单元测试|单元测试基本写法