前言

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)的更多相关文章

  1. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  2. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  3. python测试开发django-rest-framework-63.基于函数的视图(@api_view())

    前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...

  4. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  5. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  6. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  7. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  8. python测试开发django-197.django-celery-beat 定时任务

    前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...

  9. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

  10. 【python测试开发栈】python基础语法大盘点

    周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...

随机推荐

  1. Java并发编程核心概念一览

    作者博客地址 https://muggle.javaboy.org. 并行相关概念 同步和异步 同步和异步通常来形容一次方法的调用.同步方法一旦开始,调用者必须等到方法结束才能执行后续动作:异步方法则 ...

  2. pod的时区问题

    1制作image时进行配置修改 2将宿主机的时区配置文件挂载到pod中(此处注意,宿主机之间需已经完成时间同步) volumeMounts: - name: host-time mountpath: ...

  3. 编译器的系统include路径查询

    环境:Ubuntu 18.04.3 LTS 以 aarch64-linux-gnu-gcc 为例,运行如下命令: echo "main(){}" | aarch64-linux-g ...

  4. 004 Thymeleaf学习笔记

    1.Thymeleaf概述 SpringBoot并不推荐使用jsp,但是支持一些模板引擎技术:Freemarker.Thymeleaf.Mustache. 简单说, Thymeleaf 是一个跟 Ve ...

  5. SQL Server 中日志的的作用(Redo和Undo)

    简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用. 数据库的可靠性 在关系数据库系统中,我们需要数据库可靠,所谓的可靠就是当遇见 ...

  6. SQL Server 数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  7. java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...

    @RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...

  8. Java开发笔记(一百四十二)JavaFX的对话框

    JavaFX的对话框主要分为提示对话框和文件对话框两类,其中提示对话框又分作消息对话框.警告对话框.错误对话框.确认对话框四种.这四种对话框都使用Alert控件表达,并通过对话框类型加以区分,例如Al ...

  9. CF-Educational Codeforces Round 77 (Rated for Div. 2)(A-E题解)

    A. Heating (水题) 题目链接 大致思路: 因为是代价是平方,所以让每一个房间的大小平均即可,即最大和最小相差不超过一. 代码: #include<bits/stdc++.h> ...

  10. Parameter 0 of method sqlSessionTemplate in org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration required a single bean, but 2 were found:

    Parameter 0 of method orderSqlSessionFactory in com.config.MultipleDBConfig required a single bean, ...