python测试开发django-rest-framework-64.序列化(serializers.Serializer)
前言
REST framework中的serializers与Django的Form和ModelForm类非常像。我们提供了一个Serializer类,它为你提供了强大的通用方法来控制响应的输出,
以及一个ModelSerializer类,它为创建用于处理模型实例和查询集的序列化程序提供了有用的快捷实现方式。
serializers.Serializer
先从一个简单的案例开始,在apiapp目录下编辑models.py,以创建用户个人信息model为例
# models.py
from django.db import models
# 作者:上海悠悠,QQ交流群:750815713
# Create your models here.
class UserPersonalInfo(models.Model):
'''用户个人信息'''
name = models.CharField(max_length=10, verbose_name="昵称") # 昵称
sex_choices = (
(u'M', u'男'),
(u'F', u'女'),
)
sex = models.CharField(max_length=11,
choices=sex_choices,
verbose_name="性别",
)
age = models.IntegerField(verbose_name="年龄", default="", blank=True)
mail = models.EmailField(max_length=30, default="", blank=True)
create_time = models.DateField(auto_now=True, verbose_name="添加时间")
执行 makemigrations 和migrate同步数据库
python manage.py makemigrations
python manage.py migrate
Serializer是rest_framework中最简单的序列化基类,封装也是最低的。但是这个基类比较灵活,可以通过这个类来定制我们需要的序列化类。
实现这个类需要重写两个方法,create和update。
- create方法对应我们在使用API的时候通过POST来访问的,因为通常通过POST来传递我们需要新建实例的数据。
- update方法对应通过PUT/PATCH方法访问API,用来新建实例或者更新已存在的实例,这取决于数据库是否存在我们需要操作的实例。
在apiapp目录下新建一个serializersapi.py文件,在该文件先编辑需要序列化的model,id是系统默认自带的一个字段。
│ manage.py
├─apiapp
│ │ admin.py
│ │ apps.py
│ │ auth.py
│ │ models.py
│ │ serializersapi.py
│ │ tests.py
│ │ views.py
│ │ __init__.py
│ │
│ ├─migrations
│ │ │ 0001_initial.py
│ │ │ 0002_userpersonalinfo.py
│ │ │ __init__.py
│
└─yoyoapi
│ settings.py
│ urls.py
│ wsgi.py
│ __init__.py
在写序列化类的时候,字段里面的相关参数verbose_name,blank得去掉。
# serializersapi.py
from rest_framework import serializers
from .models import UserPersonalInfo
class UserPersonalInfoSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=10) # 昵称
sex_choices = (
(u'M', u'男'),
(u'F', u'女'),
)
sex = serializers.ChoiceField(choices=sex_choices
)
age = serializers.IntegerField(default="")
mail = serializers.EmailField(max_length=30, default="")
create_time = serializers.DateField(read_only=True)
def create(self,validated_data):
return UserPersonalInfo.objects.create(**validated_data)
def update(self,instance,validated_data):
instance.name = validated_data.get('name', instance.name)
instance.sex = validated_data.get('sex', instance.sex)
instance.age = validated_data.get('age', instance.age)
instance.mail = validated_data.get('mail', instance.mail)
instance.save()
return instance
在创建ArticleSerializer的时候,创建了一些字段,这些字段代表Serializer类在序列化的时候和model对应的字段。这些字段应该和model里定义的字段同名。
在定义的时候,指定了一些参数,这里只用了read_only,还有其它的参数
- write_only,required,allow_null/allow_blank,label,help_text,style,error_messages
- read_only:表示该字段只能用于API的输出,用户并不能直接指定该字段的值
- write_only:这个就和read_only相反,需要用户指定该字段的值
- required:该字段是必需的,不能为空
- allow_null/allow_blank:该字段允许为null/空
- label:标签,用于对字段显示设置
- help_text:对字段进行解释的一段文本,用于提示
- style:说明字段的类型
- error_messages:字段出错时,信息提示
update方法中instancece参数是一个model实例,也可以是一个自定义类实例,其实model也就是一个类,只是在底层封装了一些ORM操作。
views.py视图
# views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import *
from rest_framework.permissions import IsAuthenticated,AllowAny
from .serializersapi import UserPersonalInfoSerializer
# 作者:上海悠悠,QQ交流群:750815713
class UserPersonalInfoView(APIView):
'''REST framework的APIView实现获取UserPersonalInfo表 # 作者:上海悠悠,QQ交流群:750815713'''
# authentication_classes = (TokenAuthentication,) # token认证
# permission_classes = (IsAuthenticated,) # IsAuthenticated 仅通过认证的用户
permission_classes = (AllowAny,) # 允许所有用户
def get(self, request, format=None):
"""
Return a list of all UserPersonalInfo
"""
info = UserPersonalInfo.objects.all()
serializer = UserPersonalInfoSerializer(info, many=True)
return Response(serializer.data)
def post(self, request, format=None):
'''
create UserPersonalInfo
'''
verify_data = UserPersonalInfoSerializer(data=request.data)
if verify_data.is_valid():
verify_data.save()
return Response({"message": "create some data!", "data": request.data})
else:
return Response(verify_data.errors)
urls.py设置访问路径
# urls.py
from apiapp import views
from django.conf.urls import url
# 作者:上海悠悠,QQ交流群:750815713
urlpatterns = [
url(r'^userinfo', views.UserPersonalInfoView.as_view()),
]
测试接口
访问'http://127.0.0.1:8000/userinfo',post请求测试结果
POST http://127.0.0.1:8000/userinfo HTTP/1.1
User-Agent: Fiddler
Host: 127.0.0.1:8000
Content-Length: 82
Content-Type: application/json
{
"name": "yoyo",
"sex": "M",
"age": "20",
"mail": "283340479@qq.com"
}

新增成功,查看数据库,会生成一条数据

访问'http://127.0.0.1:8000/userinfo',get请求测试结果

python测试开发django-rest-framework-64.序列化(serializers.Serializer)的更多相关文章
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- python测试开发django-16.JsonResponse返回中文编码问题
前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...
- python测试开发django-rest-framework-63.基于函数的视图(@api_view())
前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...
- Django Rest framework 之 序列化
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- python测试开发django-36.一对一(OneToOneField)关系查询
前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- 【python测试开发栈】python基础语法大盘点
周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...
随机推荐
- LODOP常见问题连接(含常见小问答博文)
问答大全 纸张打印机 注册 table表格 clodop测试地址 字体 超文本 行间距.字间距 clodop回调函数 条码 页眉页脚 SET……STYLEA 水平居中 简短排查 提示报错 慢进度条 套 ...
- Win10 专业版 Hyper-V 主机计算服务无法启动
Windows 10升级1809版本后,发现Hyper-V不能用了,管理器里是一片空白,看服务Hyper-V 主机计算服务没有启动,手动启动的话失败,报错,代码1053. 自己尝试修复,也百度了很久, ...
- maven本地仓库配置文件
背景:在使用maven的过程中,感觉本地的jar包位置飘忽不定,归根结底是因为对maven的配置文件理解不清楚造成的. 在maven的安装包下面D:\apache-maven-3.6.1\conf有s ...
- PHP设计模式 - 状态模式
状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以 ...
- js精度缺失问题
/** ** 加法函数,用来得到精确的加法结果 ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. ** 调用:accAdd(arg ...
- 【题解】Luogu P5341 [TJOI2019]甲苯先生和大中锋的字符串
原题传送门 实际按照题意模拟就行 我们先求出字符串的sa 因为要在字符串中出现k次,所以我们枚举\(l,r(r-l+1=k)\)看一共有多少种合法的方案 合法方案的长度下界\(lb\)为\(Max(h ...
- Drools入门
文章转载自:http://cwqcwq.iteye.com/blog/397869 一.背景知识: 1.什么是规则引擎 Java规则引擎起源于基于规则的专家系统,而基于规则的专家系统又是专家系统的 ...
- XML和Json的特点
Xml特点: 1.有且只有一个根节点: 2.数据传输的载体 3.所有的标签都需要自定义 4.是纯文本文件 Json(JavaScript Object Notation)特点: json分为两种格式: ...
- tf.nn.softmax_cross_entropy_with_logits()函数的使用方法
import tensorflow as tf labels = [[0.2,0.3,0.5], [0.1,0.6,0.3]]logits = [[2,0.5,1], [0.1,1,3]] a=tf. ...
- java中异常的抛出:throw throws
java中异常的抛出:throw throws Java中的异常抛出 语法: public class ExceptionTest{ public void 方法名(参数列表) throws 异常列表 ...