本文转载自微信公众号“AirPython”,作者邢安国。转载本文请联系AirPython公众号。一、前言大家好,我是安国!接下来我会通过几篇文章来讲解DRF模型的序列化,详细说一下模型序列化的作用、步骤和高级用法。2、模型序列化的作用作为DRF中非常关键的一步,模型的序列化主要有三个序列化数据,用于将模型序列化为JSON格式的对象,方便数据返回形式校验。在表单请求中,用于验证用户上传的数据是否满足项目要求数据操作,可用于数据更新、数据创建、数据保存等。3.表单字段验证当指定字段时需要序列化的,可以设置字段类型,默认值,可读可写,验证错误信息等,然后对于表单域的验证,表单域的验证也有3种方式,分别对应:3-1序列化字段,以参数的形式制定。例如字段名的数据类型为字符串,max_length指定最大长度,必须输入,使用“error_messages”设置验证失败的提示信息#最大长度50#required=True:必须输入#不通过会报错:namemustbepassedname=serializers.CharField(max_length=50,required=True,error_messages={"required":"namemustbepassed"})3-2重写validate(self,attrs)验证方法。参数attrs包含所有字段。我们只需要自定义验证逻辑即可。如果验证失败,则会抛出“serializers.ValidationError”异常。比如这里验证名称必须包含关键字“深圳”,否则会抛出异常(表示验证失败)defvalidate(self,attrs):"""表单数据验证:paramattrs::return:"""print(attrs)if"Shenzhen"notinattrs.get("name"):raiseserializers.ValidationError('名称中不包含[Shenzhen],验证失败!')returnattrs3-3重写validate_fieldname(self,value)方法为单个要验证的字段名称字段已验证。如果验证失败,可以主动抛出“serializers.ValidationError”异常。defvalidate_name(self,name):"""验证名称字段:paramname::return:"""if"Shenzhen"notinname:raiseserializers.ValidationError('名称不包含[Shenzhen],验证失败!')returnname4.重写创建和更新方法创建的序列化类继承自serializers.Serializer类这里重写其中的update()和create()函数,update(self,instance,validated_data)用于更新数据,更新数据中的参数validated_data给实例create(self,validated_data)validated_data作为关键字参数创建模型=serializers.IntegerField(read_only=True)#error_messages:定义错误信息name=serializers.CharField(max_length=200,required=True,error_messages={"required":"必须传递name参数"})defupdate(self,instance,validated_data):"""更新数据,将validated_data中的数据更新为instance:paraminstance::paramvalidated_data::return:"""#修改数据instance.name=validated_data.get("name",instance.name)#保存并更新插件tance.save()returninstancedefcreate(self,validated_data):"""Createdata:paramvalidated_data::return:"""#Goods:modelreturnGoods.objects.create(**validated_data)5.最后,本章讲正常模型序列化关于模型序列化、序列化嵌套、项目实战过程的步骤,我会在下一篇文章中讲解
