序列化器:是指从数据库提取数据,转化前端所需要的数据格式并返回到前端。

  反序列化器:是指把前端传回的数据,转换成数据库需要的格式,存入数据库。

  DRF提供了两种序列化器:

  模型序列化器:是指和模型关联的序列化器,需要引入模型来定义序列化器。

  普通序列化器:是指和模型无关的序列化器,和模型无关,只是一个序列化器。

  本节主要介绍模型序列化器

1 创建模型序列化器

  在Applications/Examples/views下创建文件,名为:Schools.py

  1. from rest_framework import serializers
  2. from Applications.Examples.models import Schools
  3. from rest_framework.viewsets import ModelViewSet
  4. import re
  5.  
  6. class SchoolsSerializer(serializers.ModelSerializer):
  7. """
  8. 【功能描述】模型序列化器,主要针对模型生成的序列化器。
  9. 1 临时字段
  10. 模型序列化器中可定义临时字段,用于上传用户数据,或下发从其它模型或内存中的数据。
  11. 如果上传临时字段,则设置为write_only=True
  12. 如果下发临时字段,则设置为read_only=True
  13. 2 重新定义模型字段
  14. 对于模型中已存在的字段,可以在此重新定义约束。如:手机号,座机号,可以用正则表达式来定义。
  15. """
  16. # 手机验证码是用于前端上传的,而不需要后端下发,故定义write_only=True
  17. sms_code = serializers.CharField(min_length=6, max_length=6, write_only=True, help_text='手机验证码')
  18.  
  19. class Meta:
  20. """
  21. 【功能描述】
  22. 1 指定模型名
  23. 2 指定需要上传或下载的模型字段名
  24. 如果所有字段全部选择,则使用fields = '__all__'
  25. 如果手工指定字段,则用元组列出要指定的字段名
  26. """
  27. model = Schools
  28. fields = ('id', 'name', 'email', 'phone', 'employment_rate', 'sms_code', 'teacher_quantity', 'student_quantity')
  29. extra_kwargs = {
  30. 'id': {
  31. 'read_only': True, # 用户ID是只读的,故只能读取不能填写
  32. 'help_text': '学校ID'
  33. },
  34. 'name': {
  35. 'help_text': '学校名',
  36. 'min_length': 2,
  37. 'max_length': 10,
  38. 'error_messages': {
  39. 'min_length': '用户名不能少于两个中文字符',
  40. 'max_length': '用户名不能大于20个中文字符',
  41. },
  42. },
  43. 'employment_rate': {
  44. 'help_text': '就业率(%)',
  45. }
  46.  
  47. }
  48.  
  49. @classmethod
  50. def validate_phone(cls, value):
  51. """
  52. 【功能描述】用于验证某个字段,则用'validate_'+字段名来命名函数,validate_<field_name>
  53. """
  54. if not re.match(r'\(?0\d{2,3}[)-]?\d{7,8}', value): # 正则表达式匹配座机号
  55. raise serializers.ValidationError('不是有效的座机号')
  56. return value
  57.  
  58. @classmethod
  59. def validate_employment_rate(cls, value):
  60. """
  61. 【功能描述】用于验证某个字段,则用'validate_'+字段名来命名函数,validate_<field_name>
  62. """
  63. if value > 100:
  64. raise serializers.ValidationError('就业率不能超过100%')
  65. if value < 0:
  66. raise serializers.ValidationError('就业率不能小于0%')
  67. return value
  68.  
  69. @classmethod
  70. def validate_sms_code(cls, value):
  71. """
  72. 【功能描述】用于处理接收的临时字段,比如验证码是否过期等操作。验证完后,在保存前要删除临时字段。
  73. """
  74. return value
  75.  
  76. @classmethod
  77. def validate(cls, attrs):
  78. """
  79. 【功能描述】用于同时验证多个字段
  80. """
  81. if attrs['teacher_quantity'] <= 0:
  82. raise serializers.ValidationError('教师人数不能小于等于0')
  83. if attrs['student_quantity'] <= 0:
  84. raise serializers.ValidationError('学生人数不能小于等于0')
  85. if attrs['teacher_quantity'] >= attrs['student_quantity']:
  86. raise serializers.ValidationError('教师人数不能大于等于学生人数')
  87. return attrs
  88.  
  89. def create(self, validated_data):
  90. del validated_data['sms_code'] # 临时字段仅用于上传,保存数据库之前要删除
  91. return Schools.objects.create(**validated_data)
  92.  
  93. def update(self, instance, validated_data):
  94. """
  95. 【功能描述】用于处理只更新部分字段的情况
  96. """
  97. instance.name = validated_data.get('name')
  98. # Email允许为空,前端可传可不传,如果传了,则修改,如果没传,则维持原数据
  99. if validated_data.get('email'):
  100. instance.email = validated_data.get('email')
  101. instance.phone = validated_data.get('phone')
  102. instance.employment_rate = validated_data.get('employment_rate')
  103. instance.teacher_quantity = validated_data.get('teacher_quantity')
  104. instance.student_quantity = validated_data.get('student_quantity')
  105. instance.save()
  106. return instance
  107.  
  108. class SchoolsViewSet(ModelViewSet):
  109. queryset = Schools.objects.all()
  110. serializer_class = SchoolsSerializer 

2 增加视图

  1. class SchoolsViewSet(ModelViewSet):
  2. queryset = Schools.objects.all()
  3. serializer_class = SchoolsSerializer

3 增加路由

  在Examples分路由urls.py中增加一个路由:

  1. router.register('Schools', SchoolsViewSet) # 向路由器中注册视图集

4 运行工程,测试自动生成的所有接口。共六个接口,页面如下:

0010 基于DRF框架开发(03 模型序列化器)的更多相关文章

  1. 0012 基于DRF框架开发(04 序列化器的字段与选项)

    1 常用字段类型 字段 构造方式 BooleanField BooleanField() NullBooleanField NullBooleanField() CharField CharField ...

  2. 0009 基于DRF框架开发(02 创建模型)

    上一节介绍了DRF开发的基本流程,共五个步骤: 1 创建模型 2 创建序列化器 3 编写视图 4 配置URL 5 运行测试 本节主要讲解创建模型. 构建学校,教师,学生三个模型,这三个模型之间的关系是 ...

  3. 0011 基于DRF框架开发(04 普通序列化器)

    普通序列化器和模型无关,只是对针对提交字段的定义. 本文定义三个序列化器: 教师序列化器,学生序列化器,教师学生序列化器.这三个序列化器都使用普通序列化器. 1 教师序列化器 在Application ...

  4. 0013 基于DRF框架开发(01 基类视图 APIView)

    之前学习了模型序列化和普通序列化,我们用最简单的视图和url实现了对序列化的操作. 而实际上,象之前那种由DRF自动生成所有的视图和url的情况,在应用是使用很少.而需要用户根据实际业务需求,自定义视 ...

  5. 0008 基于DRF框架开发(01 DRF开发的基本流程)

    1 创建模型 由于之前在<004 工程配置>中,已在Applications/Organizations/models中创建了一个UserInfo模型.此处引用这个模型. from dja ...

  6. 0014 基于DRF框架开发(02 基类视图 GenericAPIView)

    前端于对数据操作的请求基本上就分为四类:增删改查,即增加.删除.修改.查询. 而DRF把前端请求分为两个大类:带ID参数请求和不带ID参数请求. 不带ID参数请求包括:增加.分布多条查询 带ID参数请 ...

  7. MapReduce教程(一)基于MapReduce框架开发<转>

    1 MapReduce编程 1.1 MapReduce简介 MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,用于解决海量数据的计算问题. MapReduce分成了两个部分: ...

  8. 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现

    基于SSH框架开发的<高校大学生选课系统>的质量属性的实现 对于可用性采取的是错误预防战术,即阻止错误演变为故障:在本系统主要体现在以下两个方面:(1)对于学生登录模块,由于初次登陆,学生 ...

  9. 基于NopCommerce框架开发的微信小程序UrShop

    Urshop小程序商城 介绍 UrShop小程序商城 2.0发布啦,发布地址https://gitee.com/urselect/urshop UrShop 根据NopCommerce框架开发的,基于 ...

随机推荐

  1. 解决Python2.7的UnicodeEncodeError: 'ascii' codec can't encode异常错误

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128) ...

  2. Linux 配置ip 子接口 多网卡绑定

    linux系统配置ip地址,图形化界面略过,这里只介绍文本行.做以下设置注意是否有此权限 查看当前路由及网关信息: [root@localhost ~]# netstat -r Kernel IP r ...

  3. linux下的cron定时任务知识梳理

    1 cron定时任务 1.1 cron介绍 为什么需要cron定时任务? 1)cron服务在安装完Linux系统后就默认就存在,主要用来定期执行命令或定期执行指定的应用程序; 2)cron服务默认情况 ...

  4. git知识简单小结

    git特点: 1)分布式 2)存储快照而非差异 3)本地有完全的版本库,几乎所有操作都在本地 4)有内在的一致性,SHA1 5)优秀的分支管理 6)支持各种协同模式 7)开源,有一些第三方软件可整合使 ...

  5. 单页应用(SPA,Single-page-App)和多页应用(MPA,Multi-page App)的区别

    单页应用(SPA,Single-page-App)和多页应用(MPA,Multi-page App)的区别 参考博客:https://www.jianshu.com/p/4c9c29967dd6

  6. shell脚本自动备份MySQL数据库

    脚本如下: #!/bin/bash #数据库IP dbserver='127.0.0.1' #数据库用户名 dbuser='root' #数据密码 dbpasswd=' #数据库,如有多个库用空格分开 ...

  7. docker启动nginx的ssl配置

    前提条件 一台云服务器(阿里云.腾讯云等的centOS) 服务器上面要有docker(安装方法这里不做介绍) 一个域名 ssl证书(两个文件:一个key后缀,一个pem后缀:生成方法很多这里不再介绍) ...

  8. h5笔记2

    •离线缓存: html配置manifest属性,cache.manifest是缓存配置文件 <html lang="zh-CN" manifest="cache.m ...

  9. lua学习之深入函数第二篇

    深入函数 2 非全局的函数 函数是第一类值,函数可以存储到全局变量,局部变量,table 字段中 lua 函数库中的大部分函数存储到 table 字段中 Lib = {} Lib.foo = func ...

  10. vuex 状态管理 入门

    vuex是什么 是一个对 数据状态实现集中式管理 的工具.可以解决组件之间传递的问题 多组件共享状态(变量),有一个数据好多组件都用 组件数大于2,任何一个组件修改其他组件都要改变 实现组件通信 St ...