深入理解 Django REST Framework 的 Serializer(上)
一、什么是 Serializer—— 概念与作用1.1、核心定义Serializer 负责将复杂数据类型如 Django 模型实例转换为 Python 原生数据类型如 dict以便渲染为 JSON/XML同时也能将解析后的数据反向验证并转换回复杂类型。1.2、两大核心功能序列化Serialization对象 → 字典用于响应反序列化Deserialization字典 → 对象用于请求而在序列化与反序列化中一定绕不开下表的方法也是我们理解序列化器的前提这两个方法均在 rest_framework\serializers.py下的 Serializer 类中后续我会一一讲解序列化器的两个任务方向方法用途输入反序列化to_internal_value() → validate()把前端数据转成干净 Python 对象输出序列化to_representation()把 Python 对象转成 JSON 安全字典二、如何定义 Serializer2.1 以serializers.Serializer 为例1、定义类继承serializers.Serializerfrom rest_framework import serializers class MobileLoginModelSerializer(serializers.Serializer):2、根据业务以及逻辑定义字段在这里我是做短信登录所以需要用到 mobile code短信验证码字段而手机号长度通常为11位短信验证码长度在4-6位设置只写。from rest_framework import serializers class MobileLoginModelSerializer(serializers.Serializer): mobile serializers.CharField( max_length11, write_onlyTrue) code serializers.CharField( min_length4, max_length6, write_onlyTrue)如果你知道ModelSerializer你可能会疑惑为什么 ModelSerializer 中不需要写那么多参数因为这个序列化器会继承在Model.py对应模型声明过的字段及其参数。而普通 Serializer 的字段不会自动获得任何约束除非你写出来3、定义字段验证方法及整体验证方法其中如果是对字段的验证方法 遵循以下原则方法名以 validate_xxx命名 xxx为该字段名称。 比如要验证手机号在上述定义的字段命名为mobile所以就是validate_mobile必须返回一个值如果你只是检验没有修改 直接返回参数中的value即可如果你对这个参数进行了修改就返回修改后的值如果是对整体进行验证 遵循以下原则必须返回参数的attrs可以对这个attrs进行添加新数据但是必须返回from rest_framework import serializers class MobileLoginModelSerializer(serializers.Serializer): ...省略上述代码 def validate_mobile(self, value): if not User.objects.get(mobilevalue): raise serializers.ValidationError(手机号不存在,codemobile) return value def validate(self, attrs): mobile attrs.get(mobile) code attrs.get(code) redis get_redis_connection(sms_code) key fsms_{mobile}_login # 1.获取Redis短信验证码判断是否存在 stored_code redis.get(key) if stored_code is None: raise serializers.ValidationError(验证码已过期,codecode) # 2.判断 code:attrs 与 code:redis if stored_code.decode() ! code: raise serializers.ValidationError(验证码错误请重新确认,codecode) redis.delete(key) attrs[user] User.objects.get(mobilemobile) return attrs三、如何使用定义好的 Serializer?3.1 以APIView视图为例1、实例化序列化器类我们需要传入的参数分别是request.data 用于反序列化数据校验context 在这里先按下不表后面会出一个专门的文章讲解这个参数的作用。新手只需记住必须传这个参数from rest_framework.views import APIView from .serializers import MobileLoginModelSerializer class MobileLoginAPIView(APIView): def post(self, request): # 1. 序列化器验证数据 serializer MobileLoginModelSerializer( datarequest.data, context{request:request} )2、调用is_valid()方法调用这个方法 序列化器就会校验本次传入的数据是否合法根据我们设置的校验规则from rest_framework.views import APIView from .serializers import MobileLoginModelSerializer class MobileLoginAPIView(APIView): def post(self, request): # 1. 序列化器验证数据 serializer MobileLoginModelSerializer( datarequest.data, context{request:request}) if not serializer.is_valid(): return Response(dataserializer.errors,statusstatus.HTTP_400_BAD_REQUEST)四、总结一个简单但完整的序列化器使用过程就是这样的可以总结成以下的步骤定义字段设置字段参数定义字段校验方法整体校验方法 如有需求实例化序列化器调用is_valid方法在下篇文章中我会继续深入研究 is_valid方法做了什么 如何完成反序列化及数据校验