ModelSerializer

DRF的serializers.Serializer所生成的序列化器是最基本的,它可以为数据库模型类定义,也可以为非数据库模型类的数据定义。一般而言,我们使用序列化器对应的都是Django的数据库模型类。DRF为我们提供了ModelSerializer来方便的对应于一个models.

ModelSerializer基于模型类自动生成一系列字段;此外还提供了create()和update()的默认实现。

下面定义新的序列化器,它将继承自ModelSerializer类。

class BookInfoSerializer2(serializers.ModelSerializer):"""继承自serializers.ModelSerializer"""class Meta:model = BookInfo        # model 指明生成哪个模型类的序列化器fields = '__all__'      # fields 指明为模型类的哪些字段被序列化

在终端中查看自动生成的序列化器如下:

>>> from apps.book.serializers import BookInfoSerializer2
>>> BookInfoSerializer2()
BookInfoSerializer2():id = IntegerField(label='ID', read_only=True)name = CharField(label='名称', max_length=20)pub_date = DateField(label='发布日期')readcount = IntegerField(label='阅读量', max_value=2147483647, min_value=-2147483648, required=False)commentcount = IntegerField(label='评论量', max_value=2147483647, min_value=-2147483648, required=False)is_delete = BooleanField(label='逻辑删除', required=False)image = ImageField(allow_null=True, label='图片', max_length=100, required=False)

下面贴上model类的定义。

class BookInfo(models.Model):"""书籍信息模型"""name = models.CharField(max_length=20, verbose_name='名称') #图书名称pub_date = models.DateField(verbose_name='发布日期') #发布日期readcount = models.IntegerField(default=0, verbose_name='阅读量') #阅读量commentcount = models.IntegerField(default=0, verbose_name='评论量') #评论量is_delete = models.BooleanField(default=False, verbose_name='逻辑删除') #逻辑删除image = models.ImageField(upload_to='book/', verbose_name='图片', null=True)

通过观察模型类和序列化器类,我们可以发现一些规律。
id是模型类默认生成的主键,序列化器让其变成只读(只能序列化,不能反序列化);通过name字段,可以发现模型类的verbose_name变成了序列化器中的label,max_length等对应不变;观察readcount字段,会发现整形类型会被序列化器自动加上max_value和min_value的限制;有默认值的字段,会自动加上required=False来取消限制;而允许为空的字段则会字段添加allow_null=True和required=False.

  • BookInfoSerializer2类中的fields = '__all__'是特殊值,代表序列化所有字段。

  • 通常fields是一个元组或者列表,例如:

    fields = ('name', 'readcount', 'commentcount')
    
  • 使用exclude可以明确排除掉哪些字段

    exclude = ('image', 'id')
    
  • 指明只读字段

    read_only_fields = ('id', 'name')
    

    设置了editable=False的模型字段以及AutoField字段将默认设置为只读。

  • 另外,如果你对ModelSerializer默认生成的某些字段的序列化器不满意,你可以手动重写某些字段的序列化。例如:

    class BookInfoSerializer2(serializers.ModelSerializer):"""继承自serializers.ModelSerializer"""# 重写name字段的序列化name = serializers.CharField(read_only=True)class Meta:model = BookInfo        # model 指明生成哪个模型类的序列化器fields = '__all__'      # fields 指明为模型类的哪些字段被序列化(反序列化)
    
  • extra_kwargs添加额外参数
    extra_kwargs可以给默认生成的序列化器添加额外参数,上面的重写也能做到,并且重写甚至可以改变字段类型,例如从CharFiled变为IntegerField. 但是extra_kwargs更加方便。下面是一个例子:

    class BookInfoSerializer2(serializers.ModelSerializer):
    """继承自serializers.ModelSerializer"""class Meta:model = BookInfo        # model 指明生成哪个模型类的序列化器fields = '__all__'      # fields 指明为模型类的哪些字段被序列化(反序列化)extra_kwargs ={# 指定read_only为True, max_value为9999, min_value为0"readcount": {"read_only": True, "max_value": 9999, "min_value": 0},"commentcount": {"max_value": 9999, "min_value": 0}}
    

    通常,我们还需要实现字段验证,因为默认的is_valid()的验证是不够的。

DRF中ModelSerializer的使用相关推荐

  1. drf中的各种view,viewset

    drf中的各种view,viewset Django REST framework里有各种各样的view,让我有点蒙,得好好捋一捋这关系. 视图的作用 Django用"视图"这个概 ...

  2. DRF中的路由Router使用

    DRF中的路由Router使用 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由列表信息. REST fra ...

  3. DRF 中Request对象中获得数据

    DRF 中response对象中获得数据 1.Request 1).data request.data 返回解析之后的请求体数据.类似于Django中标准的request.POST和 request. ...

  4. DRF中的视图集使用

    DRF中的视图集使用 常用的视图集有: ViewSet GenericViewSet ModelViewSet ReadOnlyModelViewSet ViewSet 一个ViewSet类只是一种基 ...

  5. drf中allow_null,allow_blank的区别

    1.若model如下定义: class User(models.Model):username = models.CharField(max_length=30, null=True, blank=T ...

  6. Django 基础(13)-Django drf 序列化器类to_representation和to_internal_value(处理返回的日期格式)、序列化类 ModelSerializer

    文章目录 一.Django drf 序列化 1. 背景 2. 使用思路 3. 代码demo 4. [重要]序列化类 ModelSerializer 5. DRF序列化器to_representatio ...

  7. 谈谈Django REST Framework(DRF)中的序列化器

    摘要 Django REST Framework(DRF)是一个强大的工具,可以帮助我们构建和处理RESTful API.其中的序列化器(Serializers)是其核心组件之一,它允许我们快速有效地 ...

  8. DRF (Django REST framework) 框架介绍(3)

    DRF中的Request 与 Response 1. Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST fra ...

  9. Django框架之DRF框架

    文章目录 一.前言 1.Web应用模式 2.RESTful API规范 二.简介 三.安装与配置 四.序列化器 1.创建序列化器 2.序列化操作 1)序列化过程 2)反序列化过程 3.校验规则 1)单 ...

最新文章

  1. linux cp 强制覆盖_Linux基本操作教程
  2. 原来书中说的JVM默认垃圾回收器是错的!
  3. (c#)数据结构与算法分析 --递归
  4. 【VS2005】error LNK2001: unresolved external symbol _main 正确解决办法
  5. 超大数据量存储常用数据库分表分库算法总结
  6. 城里城外看SSDT[转]
  7. python图像开闭区间_自动开闭器不良故障案例分析
  8. 论基于candence的组装清单做法
  9. Devoxx 2011印象
  10. 《细胞》重磅成果!任兵课题组绘制迄今最大规模人类单细胞染色质可及性图谱...
  11. 如何移植mysql数据库_如何把本地MySql数据库移植到远程服务器上
  12. 多维度积分管理系统java_Java毕业设计——超市积分管理系统项目设计
  13. MATLAB 格拉布斯准则代码
  14. 【PCB Layout】PCB布局布线经验总结
  15. mumu模拟器切换android,MuMu模拟器“键位设置”功能详解!如有问题请联系在线客服~...
  16. 5.3.4—二叉查找树—Convert Sorted Array to Binary Sear Tree
  17. 【源码分析】Android触摸事件的分发拦截
  18. mysql查询最轻的零件_数据库复习题
  19. C 程序设计语言(第2版)
  20. Dalvik虚拟机探析

热门文章

  1. BS1060-基于BS架构+mysql数据库实现在线法律法规查阅系统
  2. Java实现:快速排序
  3. 转: C#控制鼠标点击,移动,滑轮滚动
  4. 禁用弹出窗口阻止程序
  5. for-forEach-stream三种遍历方法执行效率比较与选用思考
  6. 机器学习是如何利用线性代数来解决数据问题的
  7. Java SE 学习笔记 第二记
  8. 关于探索者机器人模块的相关学习(一)——机械运动
  9. python-关于一个二维列表,按照给定一个顺序列表来进行排序(个人总结,不喜勿喷)
  10. java企业面试填空题_Java企业面试题填空题及答案