当前位置: 首页 > news >正文

深入理解 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 安全字典

二、如何定义 Serializer?

2.1 以serializers.Serializer 为例

1、定义类继承serializers.Serializer

from 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_length=11, write_only=True) code = serializers.CharField( min_length=4, max_length=6, write_only=True)

如果你知道ModelSerializer,你可能会疑惑?为什么 ModelSerializer 中不需要写那么多参数,因为这个序列化器会继承在Model.py对应模型声明过的字段及其参数。而普通 Serializer 的字段不会自动获得任何约束,除非你写出来!


3、定义字段验证方法及整体验证方法

其中如果是对字段的验证方法 遵循以下原则

  1. 方法名以 validate_xxx命名, xxx为该字段名称。 比如要验证手机号,在上述定义的字段命名为mobile,所以就是validate_mobile
  2. 必须返回一个值,如果你只是检验没有修改 直接返回参数中的value即可,如果你对这个参数进行了修改就返回修改后的值

如果是对整体进行验证 遵循以下原则

  1. 必须返回参数的attrs,可以对这个attrs进行添加新数据,但是必须返回!
from rest_framework import serializers class MobileLoginModelSerializer(serializers.Serializer): ...省略上述代码 def validate_mobile(self, value): if not User.objects.get(mobile=value): raise serializers.ValidationError("手机号不存在",code='mobile') return value def validate(self, attrs): mobile = attrs.get('mobile') code = attrs.get('code') redis = get_redis_connection('sms_code') key = f'sms_{mobile}_login' # 1.获取Redis短信验证码判断是否存在 stored_code = redis.get(key) if stored_code is None: raise serializers.ValidationError("验证码已过期",code='code') # 2.判断 code:attrs 与 code:redis if stored_code.decode() != code: raise serializers.ValidationError("验证码错误,请重新确认",code='code') redis.delete(key) attrs['user'] = User.objects.get(mobile=mobile) 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( data=request.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( data=request.data, context={'request':request}) if not serializer.is_valid(): return Response(data=serializer.errors,status=status.HTTP_400_BAD_REQUEST)

四、总结

一个简单但完整的序列化器使用过程就是这样的,可以总结成以下的步骤

  1. 定义字段,设置字段参数
  2. 定义字段校验方法,整体校验方法 (如有需求)
  3. 实例化序列化器,调用is_valid方法

在下篇文章中,我会继续深入研究 is_valid方法做了什么 如何完成反序列化及数据校验

http://www.cnnetsun.cn/news/1501425.html

相关文章:

  • 【AI总结】【技术总结】深入剖析编程语言的分类:运行时语言 vs 编译型语言
  • 拒绝Token无效消耗 蚂蚁数科推出百灵企业版金融大模型
  • OpenClaw 勾搭 Qwen 官方 OAuth 全攻略:从新手村到实战大牛
  • 如何用智能工具重塑英雄联盟体验:League-Toolkit全场景应用指南
  • 贝叶斯岭回归实战:用Python搞定金融数据预测(附完整代码)
  • AI大模型评测避坑指南:读懂这5大维度4类方法,告别跑分陷阱,精准选型落地
  • 告别单调!用这招让你的VSCode Markdown标题五彩斑斓(2023最新配置)
  • 快速原型:用快马AI一键生成Win11右键菜单恢复工具脚本
  • iOS-通用链接link的作用
  • 实时屏幕翻译:打破语言壁垒的跨场景解决方案
  • Vue.Draggable:告别拖拽焦虑,三分钟解锁丝滑交互体验
  • 永磁同步电机双矢量模型预测电流MPCC控制仿真:传统与现代控制策略的对比分析
  • 保姆级教程:在CherryStudio中为Qwen/DeepSeek模型配置专属知识库(含思源笔记API对接全流程)
  • Steam挂卡终极指南:5分钟学会用Idle Master自动获取所有交易卡片
  • MCP2515 CAN控制器硬件设计与驱动开发详解
  • 《QGIS快速入门与应用基础》240:指北针旋转与大小调整
  • 思源宋体终极指南:免费商用中文字体解决方案从入门到精通
  • 大数据+AI+人|扑兔AI打造企业智慧经营,落地全域获客
  • 英雄联盟玩家必备:LeagueAkari终极辅助工具完全指南
  • IndexTTS2 V23部署指南:解决首次运行模型下载问题
  • VLC播放器界面个性化:VeLoCity皮肤全场景配置指南
  • 从‘相对’到‘绝对’:用STC32G实现步进电机的两种定位模式,附完整代码与调试笔记
  • OpenFeign请求头拦截实战:如何用RequestInterceptor统一添加认证Token?
  • 逆向实战:手把手带你拆解京东H5ST 5.2.0最新版加密(附Python复现脚本)
  • 别再羡慕别人的AI配音了!手把手教你用PaddleSpeech在百度AI Studio上克隆自己的声音(附录音避坑指南)
  • Python》》FastAPi 接口
  • 如何用zlmediakit的CAPI将H264内存数据转为RTSP流(附完整代码)
  • 树莓派4B厨房智能监测系统设计与实现
  • 经典 WinCC 一个画面监控多个设备及趋势图实现指南
  • 3个核心革新让英雄联盟玩家彻底告别繁琐游戏操作