django restframework Serializers
序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型。序列化器还提供反序列化,在首次验证传入数据之后,可以将解析的数据转换回复杂类型。
REST framework 中的序列化类与 Django 的 Form 和 ModelForm 类非常相似。我们提供了一个 Serializer 类,它提供了一种强大的通用方法来控制响应的输出,以及一个 ModelSerializer 类,它为创建处理模型实例和查询集的序列化提供了有效的快捷方式。
serializers.Serializer
举个小栗子
- # app/serializers.py
- from rest_framework import serializers
- from datetime import datetime
- class DemoSerializer(serializers.Serializer):
- email = serializers.EmailField()
- content = serializers.CharField(max_length=200)
- created = serializers.DateTimeField()
- # app/views.py
- class DemoAPIView(APIView):
- def get(self, request, *args, **kwargs):
- comment = {
- "email":"leila@example.com",
- "content":"foo bar",
- "created":datetime.now()
- }
- serializer = DemoSerializer(data=comment)
- serializer.is_valid(raise_exception=True)
- data = serializer.validated_data
- return Response(data=data)
.is_valid() 方法带有一个可选的 raise_exception 标志,如果存在验证错误,将导致它引发 serializers.ValidationError 异常。
保存实例
BaseSerializer save源码
- def save(self, **kwargs):
- ...
- validated_data = dict(
- list(self.validated_data.items()) +
- list(kwargs.items())
- )
- if self.instance is not None:
- self.instance = self.update(self.instance, validated_data)
- assert self.instance is not None, (
- '`update()` did not return an object instance.'
- )
- else:
- self.instance = self.create(validated_data)
- assert self.instance is not None, (
- '`create()` did not return an object instance.'
- )
- return self.instance
调用自身create,update方法。
字段验证
你可以通过向 Serializer 子类添加 .validate_<field_name> 方法来指定自定义字段级验证。这些与 Django 表单上的 .clean_<field_name> 方法类似。
这些方法只有一个参数,就是需要验证的字段值。
您的 validate_<field_name> 方法应返回验证值或引发 serializers.ValidationError。
for example
- # app/serializers.py
- import re
- from datetime import datetime
- from rest_framework import serializers
- class DemoSerializer(serializers.Serializer):
- email = serializers.EmailField()
- mobile = serializers.CharField(max_length=11)
- content = serializers.CharField(max_length=200)
- created = serializers.DateTimeField()
- def validate_mobile(self, value):
- condition = re.search(r"1[34578][0-9]{9}", value)
- if condition:
- return value
- else:
- raise serializers.ValidationError(
- "请输入合法的手机号"
- )
- # app/views.py
- class DemoAPIView(APIView):
- def get(self, request, *args, **kwargs):
- comment = {
- "email":"leila@example.com",
- "mobile":"12354521541",
- "content":"foo bar",
- "created":datetime.now()
- }
- serializer = DemoSerializer(data=comment)
- serializer.is_valid(raise_exception=True)
- data = serializer.validated_data
- return Response(data=data)
对象级验证
如果要对多个字段进行其他的验证,请将一个名为 .validate() 的方法添加到您的 Serializer 子类中。这个方法只有一个参数,它是一个字段值(field-value)的字典。如果有必要,它应该引发一个 ValidationError,或者只是返回验证的值
- from rest_framework import serializers
- class EventSerializer(serializers.Serializer):
- description = serializers.CharField(max_length=100)
- start = serializers.DateTimeField()
- finish = serializers.DateTimeField()
- def validate(self, data):
- """
- Check that the start is before the stop.
- """
- if data['start'] > data['finish']:
- raise serializers.ValidationError("finish must occur after start")
- return data
处理嵌套对象
前面的例子适用于处理只具有简单数据类型的对象,但有时还需要能够表示更复杂的对象,其中对象的某些属性可能不是简单的数据类型,如字符串,日期或整数。
Serializer 类本身就是一种 Field,可以用来表示一个对象类型嵌套在另一个对象类型中的关系。
- class UserSerializer(serializers.Serializer):
- email = serializers.EmailField()
- username = serializers.CharField(max_length=100)
- class CommentSerializer(serializers.Serializer):
- user = UserSerializer()
- content = serializers.CharField(max_length=200)
- created = serializers.DateTimeField()
如果嵌套对象可以是 None 值,则应将 required = False 标志传递给嵌套的序列化类。
- class CommentSerializer(serializers.Serializer):
- user = UserSerializer(required=False) # May be an anonymous user.
- content = serializers.CharField(max_length=200)
- created = serializers.DateTimeField()
同样,如果嵌套对象是一个列表,则应将 many = True 标志传递给嵌套的序列化类。
- class CommentSerializer(serializers.Serializer):
- user = UserSerializer(required=False)
- edits = EditItemSerializer(many=True) # A nested list of 'edit' items.
- content = serializers.CharField(max_length=200)
- created = serializers.DateTimeField()
ModelSerializer
通常你会想要序列化类紧密地映射到 Django 模型定义上。
ModelSerializer 类提供了一个快捷方式,可让你自动创建一个 Serializer 类,其中的字段与模型类字段对应。
ModelSerializer 类与常规 Serializer 类相同,不同之处在于:
它会根据模型自动生成一组字段。
它会自动为序列化类生成验证器,例如 unique_together 验证器。
它包含 .create() 和 .update() 的简单默认实现。
声明ModelSerializer如下所示:
- class AccountSerializer(serializers.ModelSerializer):
- class Meta:
- model = Account
- fields = ('id', 'account_name', 'users', 'created')
- class AccountSerializer(serializers.ModelSerializer):
- class Meta:
- model = Account
- fields = "__all__"
- class AccountSerializer(serializers.ModelSerializer):
- class Meta:
- model = Account
- exclude = ('users',)
django restframework Serializers的更多相关文章
- django restframework serializer 增加自定义字段
在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段.有两种方法实现 ...
- django restframework 快速入门
django restframework 快速入门 基本流程 建立 Models 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示 ...
- Django Restframework 实践(一)
具备以下知识: django http://www.cnblogs.com/menkeyi/p/5882464.html http://www.cnblogs.com/menkeyi/p/588245 ...
- django restframework 的日常使用
本文讨论 django restframework 的日常使用,满足常用 api 编写的需求,比如 List, Detail, Update, Put, Patch 等等.探讨 django rest ...
- django restframework
一.django restframework 请求流程源码剖析 上面的认证一个流程是rest_framework的关于APIauth的认证流程,,这个流程试用权限.频率.版本.认证.这个四个组件都是通 ...
- django restframework jwt
既然要来学习jwt(json web token),那么我们肯定是先要了解jwt的优势以及应用场景--跨域认证. $ pip install djangorestframework-jwt 传统coo ...
- django序列化 serializers
Django的序列化工具让你可以将Django的模型‘翻译’成其它格式的数据.通常情况下,这种其它格式的数据是基于文本的,并且用于数据交换\传输过程. 一.序列化数据 Django为我们提供了一个强大 ...
- django: rest-framework的 分页和过滤
django: rest-framework的 分页和过滤 2018年06月28日 10:09:01 weixin_42359464 阅读数:136 标签: flaskrestframeworkdja ...
- Django RestFramework (DRF)
准备: 下载 pip install djangorestframework 一 APIView源码解析 1 预备知识 CBV(class based view)FBV(function based ...
随机推荐
- 聊聊Zookeeper应用场景、架构设计、选主机制
Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...
- C#_获取路径
一.获取当前文件的路径 1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 获取模块的完整路径,包括文件名. ...
- 分布式监控系统Zabbix--完整安装记录(7)-使用percona监控MySQL
前面已经介绍了分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控,但是没有提供可以直接使用的Key,太过简陋,监控效果不佳.要想更加仔细的监控Mysql,业内同学们都会选择 ...
- SQL中not in 和not exists
在SQL中倒是经常会用到子查询,而说到子查询,一般用的是in而不是exists,先不谈效率问题,就先说说会遇到哪些问题. 用到in当取反的时候,肯定先想到的就是not in.但是在使用not in的时 ...
- C_数据结构_递归自己调用自己
# include <stdio.h> void f(int n) { ) printf("哈哈\n"); else f(n-i); } int main(void) ...
- C_数据结构_数组
//数组 # include <stdio.h> # include <malloc.h> //包含了 malloc 函数 # include <stdlib.h> ...
- js控制css时注意
font-size:10px--------e.style.fontSize="10px " 属性名:font-size--------fontSize; 属性值:10px---- ...
- python语言几个常见函数的使用
写代码,有如下变量,请按照要求实现每个功能: name = " Kobe Bean Bryant" a. 移除 name 变量对应的值左边的空格,并输出移除后的内容 name = ...
- Linux环境C程序设计
Linux基础 常用shell命令 命令 说明 命令 说明 man 查看联机帮助 ls 查看目录及文件列表 cp 复制目录或文件 mv 移动目录或文件 cd 改变文件或目录 rm 删除文件或目录 mk ...
- Hadoop技术里面有BSP模型、MPI模型
MPI模型,各种编程语言的库挺多. BSP模型,刚才知道.