序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。

REST framework 中的序列化类与 Django 的 Form 和 ModelForm 类非常相似。我们提供了一个 Serializer 类,它提供了一种强大的通用方法来控制响应的输出,以及一个 ModelSerializer 类,它为创建处理模型实例和查询集的序列化提供了有效的快捷方式。

serializers.Serializer

举个小栗子

  1. # app/serializers.py
  2. from rest_framework import serializers
  3. from datetime import datetime
  4.  
  5. class DemoSerializer(serializers.Serializer):
  6. email = serializers.EmailField()
  7. content = serializers.CharField(max_length=200)
  8. created = serializers.DateTimeField()
  9.  
  10. # app/views.py
  11. class DemoAPIView(APIView):
  12. def get(self, request, *args, **kwargs):
  13. comment = {
  14. "email":"leila@example.com",
  15. "content":"foo bar",
  16. "created":datetime.now()
  17. }
  18. serializer = DemoSerializer(data=comment)
  19.  
  20. serializer.is_valid(raise_exception=True)
  21. data = serializer.validated_data
  22. return Response(data=data)

.is_valid() 方法带有一个可选的 raise_exception 标志,如果存在验证错误,将导致它引发 serializers.ValidationError 异常。

保存实例

BaseSerializer save源码

  1. def save(self, **kwargs):
  2. ...
  3.  
  4. validated_data = dict(
  5. list(self.validated_data.items()) +
  6. list(kwargs.items())
  7. )
  8.  
  9. if self.instance is not None:
  10. self.instance = self.update(self.instance, validated_data)
  11. assert self.instance is not None, (
  12. '`update()` did not return an object instance.'
  13. )
  14. else:
  15. self.instance = self.create(validated_data)
  16. assert self.instance is not None, (
  17. '`create()` did not return an object instance.'
  18. )
  19.  
  20. return self.instance

  调用自身create,update方法。

字段验证

你可以通过向 Serializer 子类添加 .validate_<field_name> 方法来指定自定义字段级验证。这些与 Django 表单上的 .clean_<field_name> 方法类似。

这些方法只有一个参数,就是需要验证的字段值。

您的 validate_<field_name> 方法应返回验证值或引发 serializers.ValidationError。

for example

  1. # app/serializers.py
  2. import re
  3. from datetime import datetime
  4. from rest_framework import serializers
  5.  
  6. class DemoSerializer(serializers.Serializer):
  7. email = serializers.EmailField()
  8. mobile = serializers.CharField(max_length=11)
  9. content = serializers.CharField(max_length=200)
  10. created = serializers.DateTimeField()
  11.  
  12. def validate_mobile(self, value):
  13. condition = re.search(r"1[34578][0-9]{9}", value)
  14. if condition:
  15. return value
  16. else:
  17. raise serializers.ValidationError(
  18. "请输入合法的手机号"
  19. )
  20.  
  21. # app/views.py
  22. class DemoAPIView(APIView):
  23. def get(self, request, *args, **kwargs):
  24. comment = {
  25. "email":"leila@example.com",
  26. "mobile":"12354521541",
  27. "content":"foo bar",
  28. "created":datetime.now()
  29. }
  30. serializer = DemoSerializer(data=comment)
  31.  
  32. serializer.is_valid(raise_exception=True)
  33. data = serializer.validated_data
  34. return Response(data=data)

对象级验证

如果要对多个字段进行其他的验证,请将一个名为 .validate() 的方法添加到您的 Serializer 子类中。这个方法只有一个参数,它是一个字段值(field-value)的字典。如果有必要,它应该引发一个 ValidationError,或者只是返回验证的值

  1. from rest_framework import serializers
  2. class EventSerializer(serializers.Serializer):
  3. description = serializers.CharField(max_length=100)
  4. start = serializers.DateTimeField()
  5. finish = serializers.DateTimeField()
  6. def validate(self, data):
  7. """
  8. Check that the start is before the stop.
  9. """
  10. if data['start'] > data['finish']:
  11. raise serializers.ValidationError("finish must occur after start")
  12. return data

处理嵌套对象

前面的例子适用于处理只具有简单数据类型的对象,但有时还需要能够表示更复杂的对象,其中对象的某些属性可能不是简单的数据类型,如字符串,日期或整数。

Serializer 类本身就是一种 Field,可以用来表示一个对象类型嵌套在另一个对象类型中的关系。

  1. class UserSerializer(serializers.Serializer):
  2. email = serializers.EmailField()
  3. username = serializers.CharField(max_length=100)
  4. class CommentSerializer(serializers.Serializer):
  5. user = UserSerializer()
  6. content = serializers.CharField(max_length=200)
  7. created = serializers.DateTimeField()

如果嵌套对象可以是 None 值,则应将 required = False 标志传递给嵌套的序列化类。

  1. class CommentSerializer(serializers.Serializer):
  2. user = UserSerializer(required=False) # May be an anonymous user.
  3. content = serializers.CharField(max_length=200)
  4. created = serializers.DateTimeField()

同样,如果嵌套对象是一个列表,则应将 many = True 标志传递给嵌套的序列化类。

  1. class CommentSerializer(serializers.Serializer):
  2. user = UserSerializer(required=False)
  3. edits = EditItemSerializer(many=True) # A nested list of 'edit' items.
  4. content = serializers.CharField(max_length=200)
  5. created = serializers.DateTimeField()

ModelSerializer

通常你会想要序列化类紧密地映射到 Django 模型定义上。

ModelSerializer 类提供了一个快捷方式,可让你自动创建一个 Serializer 类,其中的字段与模型类字段对应。

ModelSerializer 类与常规 Serializer 类相同,不同之处在于:

它会根据模型自动生成一组字段。

它会自动为序列化类生成验证器,例如 unique_together 验证器。

它包含 .create() 和 .update() 的简单默认实现。

声明ModelSerializer如下所示:

  1. class AccountSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = Account
  4. fields = ('id', 'account_name', 'users', 'created')
  1. class AccountSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = Account
  4. fields = "__all__"
  1. class AccountSerializer(serializers.ModelSerializer):
  2. class Meta:
  3. model = Account
  4. exclude = ('users',)

  

django restframework Serializers的更多相关文章

  1. django restframework serializer 增加自定义字段

    在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...

  2. django restframework 快速入门

    django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...

  3. Django Restframework 实践(一)

    具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...

  4. django restframework 的日常使用

    本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...

  5. django restframework

    一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...

  6. django restframework jwt

    既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...

  7. django序列化 serializers

    Django的序列化工具让你可以将Django的模型‘翻译’成其它格式的数据.通常情况下,这种其它格式的数据是基于文本的,并且用于数据交换\传输过程. 一.序列化数据 Django为我们提供了一个强大 ...

  8. django: rest-framework的 分页和过滤

    django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...

  9. Django RestFramework (DRF)

    准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...

随机推荐

  1. 聊聊Zookeeper应用场景、架构设计、选主机制

    Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...

  2. C#_获取路径

    一.获取当前文件的路径 1.  System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName  获取模块的完整路径,包括文件名. ...

  3. 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL

    前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...

  4. SQL中not in 和not exists

    在SQL中倒是经常会用到子查询,而说到子查询,一般用的是in而不是exists,先不谈效率问题,就先说说会遇到哪些问题. 用到in当取反的时候,肯定先想到的就是not in.但是在使用not in的时 ...

  5. C_数据结构_递归自己调用自己

    # include <stdio.h> void f(int n) { ) printf("哈哈\n"); else f(n-i); } int main(void) ...

  6. C_数据结构_数组

    //数组 # include <stdio.h> # include <malloc.h> //包含了 malloc 函数 # include <stdlib.h> ...

  7. js控制css时注意

    font-size:10px--------e.style.fontSize="10px " 属性名:font-size--------fontSize; 属性值:10px---- ...

  8. python语言几个常见函数的使用

    写代码,有如下变量,请按照要求实现每个功能: name = " Kobe Bean Bryant" a. 移除 name 变量对应的值左边的空格,并输出移除后的内容 name = ...

  9. Linux环境C程序设计

    Linux基础 常用shell命令 命令 说明 命令 说明 man 查看联机帮助 ls 查看目录及文件列表 cp 复制目录或文件 mv 移动目录或文件 cd 改变文件或目录 rm 删除文件或目录 mk ...

  10. Hadoop技术里面有BSP模型、MPI模型

    MPI模型,各种编程语言的库挺多. BSP模型,刚才知道.