前言

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请求测试结果

最新文章

  1. 发布:.NET开发人员必备的可视化调试工具(你值的拥有)
  2. php 二维数组排序
  3. 1.9 基础知识——GP2.10 高级别的领导检查(Higher level management)
  4. Oracle 应用于.NET平台
  5. MongoDB 3.0.6 安装 增删改查
  6. bootstrap-9
  7. 利用正则表达式去掉html代码
  8. hdu 3863 No Gambling
  9. linux下如何安装rzsz
  10. 初识beego
  11. STM32 USB虚拟串口(转)
  12. SDWebImage源码解读之干货大总结
  13. java web项目中 读取properties 路径的问题
  14. Eclipse显示行号
  15. Django项目开发
  16. C语言中可变参数的函数(三个点,“...”)
  17. CentOS 7.4下使用yum安装MySQL5.7.20 最简单的
  18. android 面试题(一)
  19. 【逆向知识】GitHub:Awesome-Hacking(黑客技能列表-逆向)
  20. 统计难题 HDU1251

热门文章

  1. WeQuant教程—1.2 从简单的量化系统开始
  2. 转 python2 与 python3 的编码
  3. 将你的数据导入到json格式
  4. jquery对div元素进行鼠标移动(稍稍修改下可以实现div跟随鼠标)
  5. LeetCode 942. 增减字符串匹配(DI String Match) 49
  6. 资源池-数据库连接池简单实现-JAVA版本
  7. linux查看当前路径命令 pwd
  8. 对一次 redis 未授权写入攻击的分析以及学习
  9. 关于使用K8S的技术流程
  10. WPF 很少人知道的科技