共计 1837 个字符,预计需要花费 5 分钟才能阅读完成。
1. 模型序列化的作用?
作为 DRF 中十分要害的一步,模型序列化次要作用有 3 个
- 序列化数据
用于将模型序列化成 JSON 格局的对象,便于数据返回
- 表单验证
在表单申请中,用于验证用户上传的数据是否满足我的项目要求
- 数据操作
可用于数据更新、数据创立、数据保留等
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)
用于更新数据,将参数 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)
最近整顿了几百 G 的 Python 学习材料,蕴含新手入门电子书、教程、源码等等,收费分享给大家!想要的返回“Python 编程学习圈”,发送“J”即可收费取得