DRF序列化器 get_<字段名> validate_<字段名>
1. drf序列化 反序列化定义
序列化:python后端 -> 前端 python对象转成json对象
反序列化:前端数据 -> python后端 json/form-data 转成python数据库对象保存
2. get_<字段名> validate_<字段名>的差异
get_<字段名> 一般用于”序列化“过程,且多为read_only,get_Field(self, instance) 中参数instance是serializer中的model实例(单个),本质上get_Field是回调钩子函数,DRF会根据对象个数遍历然后调用get_函数。下图说明get_函数是回调钩子函数,DRF自动调用(每个单个实例对象)
validate_<字段名> 一般用于”反序列化“过程,校验前端传过来的数据!同理,valiate_函数是局部钩子函数,同get_Field一样传入的是单个实例的字段值(指定),若是validate全局钩子函数,参数attrs则是单个实例的所有字段json
注意:默认情况下,modelserializer不会自动生成每个model的字段的get_方法,但是自己写的时候都是需要重新生成新字段给前端,才会创建;对于validate_方法同样如此,用于反序列化过程!
get_<字段名>(self, instance),instance其实就是model类;
序列化器中:fields一般是默认model中的字段名,如果再自定义字段名,需要使用get_<字段名>,这个主要是序列化过程;反序列化没有自定义字段!fileds是反序列化、序列化2个过程;而filter中的fileds只是从前端往后端传,用来filter的。
序列化中:serializer.data用于获取序列化后的数据!
3. 注意
入门时,可以先不纠结底层源码实现,需要覆盖对应函数时,也是比较浅显的一层,简简单单的用就可以,不用太纠结源码,先熟练使用,人家框架就是这么设计的。然后如果想提升自己,等熟练后,再专门学习代码设计、设计模式、特性!
4.其他
serializer和viewset之间互享request,drf已经设置了,但是实际应用中,serializer不止1个,那么serializer就不能全部都可以获取request,所以需要显式传入(在serilizer定义中)