RESTful-rest_framework应用第二篇(get、post的序列化与反序列化)
目的是:
利用rest_framework实现对数据库内容的查看get请求(序列化)、提交保存数据post请求 (反序列化)
rest_framework序列化组件(即查看和)
第一步:基于Django搭建RESTful框架
第二步:配置信息
settings.py配置
settings里面全局解析器:
#设置解析器(对发送过来的数据信息格式进项校验并做进一步处理)
#全局可以配好多个,局部配一个就行(先走局部的)
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser']
}
views.py局部解析器:
#JSONParser,FormParser局部解析器,一般只需要写一个就行
from rest_framework.parsers import JSONParser,FormParser
class Book(APIView): #解析器:对浏览器发送post请求过来的数据类型做解析
#当指向下面post请求,运行request.data的时候才会去执行解析器
parser_classes = [JSONParser,FormParser]
def get(self,request): #request是已经处理好的request ret = models.Book.objects.all()
print(ret,type(ret)) #ret是QuerySet对象 <class 'django.db.models.query.QuerySet'> # 实例化上面的BookSerializer拿到一个book_ser对象
# BookSerializer参数(ret:queryset对象,many=True代表序列化多条,many=False 代表序列化一条)
book_ser=BookSerializer(ret,many=True)
#book_ser.data不是json格式的字符串,而是个字典
#所以Response内部一定是对book_ser.data做了序列化
return Response(book_ser.data) def post(self,request):
print('')
print(request.data)
return HttpResponse('ok') # 杂乱内容整理:
# print(request.POST)
#对请求过来的数据进项验证,检验每个字段是否符合录入要求,并保存
ser = BookSerializer(data=request.data) #post请求过来数据符合每个字段要求,就允许写入数据库
if ser.is_valid():
ser.save()
return Response(ser.save()) #不符合要求就返回错误信息
else:
print(ser.errors) return HttpResponse(json.dumps(ser.errors))
models.py里面的设置:
from django.db import models # Create your models here. from django.db import models class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField()
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author") def __str__(self):
return self.title #我了验证可以覆盖重写字段的方法
def test(self):
return '' class Publish(models.Model):
name=models.CharField(max_length=32)
email=models.EmailField()
# def __str__(self):
# return self.name class Author(models.Model):
name=models.CharField(max_length=32)
age=models.IntegerField()
def __str__(self):
return self.name
views.py配置:
from django.shortcuts import render,HttpResponse,redirect
import json
from api import models
# Create your views here. # from api.models import Book from rest_framework.views import APIView
from rest_framework import serializers
from rest_framework.response import Response from rest_framework.serializers import SerializerMethodField #为了验证方式三
class AuthorsSerializer(serializers.Serializer):
id = serializers.CharField()
name = serializers.CharField()
age = serializers.CharField() class PublishSerializer(serializers.Serializer):
id = serializers.CharField()
name = serializers.CharField()
email = serializers.CharField() #RESful提供的一个序列化组件BookSerializer,可以控制传入的参数
class BookSerializer(serializers.Serializer):
#指定字段重命名,例如:将title重命名为xx
xx = serializers.CharField(source='title')
#添加新字段:只要models里面指定一个test方法,就会执行并显示一条新的字段
qqq=serializers.CharField(source='test') title=serializers.CharField()
price=serializers.CharField()
pub_date=serializers.DateField()
#publish是个object对象,所以可以.name查看里面的内容
publish=serializers.CharField(source="publish.name") #查询所有作者:
#方式一:
authors=serializers.CharField(source="authors.all") #方式二:for循环拿到作者对象
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ll=[]
for author in obj.authors.all():
print(author)
ll.append({'name':author.name,'age':author.age})
return ll #方式三:将作者实例化
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ret_authors = obj.authors.all() ser=AuthorsSerializer(ret_authors,many=True)
return ser.data #方式四:
class BookSerializer(serializers.ModelSerializer):
class Meta:
#第一步:先拿到所有字段
model = models.Book
#__all__要去所有字段
fields = '__all__'
# 指定显示要取的字段 (注意指定和去除不能同时用)
# fields=('id','title')
# 去除某个或某几个字段不显示
# exclude=('id','publish') # 重新tiltle字段,进行重命名
# xx = serializers.CharField(source='title') #第二步:查看书对应的所有作者,(再重写authors字段,让其所以作者信息,而不只是显示序列号)
authors=serializers.SerializerMethodField()
def get_authors(self,obj):
ret_authors = obj.authors.all()
# print(ret_authors,type(ret_authors)) ser=AuthorsSerializer(ret_authors,many=True)
return ser.data #同理,查看书对应的的出版社
publish=serializers.SerializerMethodField()
def get_publish(self,obj):
ret_publish= obj.publish
print(ret_publish,type(ret_publish)) #Publish object
ser = PublishSerializer(ret_publish,many=False)
print(ser.data)
return ser.data #设置title字段为必填字段,并设计中文提示信息
title = serializers.CharField(error_messages={'required':'标题为必填字段'}) #字段校验和反序列化: #局部钩子:用来校验1个字段
def validate_title(self,value):
from rest_framework.exceptions import ValidationError
print(value)
# raise ValidationError('就是看你不爽')
return value #全局钩子:多个字段间对比检验
def validate(self,attrs):
from rest_framework.exceptions import ValidationError
if attrs.get('title') == attrs.get('price'):
return attrs
else:
raise ValidationError('书名和价格不一样') class Book(APIView):
def get(self,request):
ret = models.Book.objects.all()
# BookSerializer可以获取请求的数据
book_ser = BookSerializer(ret,many=True)
print(book_ser.data)
return Response(book_ser.data)
#post请求,及实现保存数据
def post(self,request):
# BookSerializer也可以保存数据信息到数据库
ser=BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
return HttpResponse('提交的post请求数据符合要求,已成功录入后台') else:
print(ser.errors)
# return Response(ser.errors)
return HttpResponse(json.dumps(ser.errors)) #RESTfu自带的处理请求的模块方法
#JSONParser,FormParser局部解析器,一般只需要写一个就行
from rest_framework.parsers import JSONParser,FormParser
class Book(APIView): #解析器:对浏览器发送post请求过来的数据类型做解析
#当指向下面post请求,运行request.data的时候才会去执行解析器
parser_classes = [JSONParser,FormParser] def get(self,request): #request是已经处理好的request ret = models.Book.objects.all()
print(ret,type(ret)) #ret是QuerySet对象 <class 'django.db.models.query.QuerySet'> # 实例化上面的BookSerializer拿到一个book_ser对象
# BookSerializer参数(ret:queryset对象,many=True代表序列化多条,many=False 代表序列化一条)
book_ser=BookSerializer(ret,many=True)
#book_ser.data不是json格式的字符串,而是个字典
#所以Response内部一定是对book_ser.data做了序列化
return Response(book_ser.data) def post(self,request):
print('')
print(request.data)
return HttpResponse('ok') # 杂乱内容整理:
# print(request.POST)
#对请求过来的数据进项验证,检验每个字段是否符合录入要求,并保存
ser = BookSerializer(data=request.data) #post请求过来数据符合每个字段要求,就允许写入数据库
if ser.is_valid():
ser.save()
return Response(ser.save()) #不符合要求就返回错误信息
else:
print(ser.errors) return HttpResponse(json.dumps(ser.errors))
知识点分解,如下:
rest-framework序列化之ModelSerializer
class BookSerializer(serializers.ModelSerializer):
class Meta:
#第一步:先拿到所有字段
model = models.Book
#__all__要去所有字段
fields = '__all__'
# 指定显示要取的字段 (注意指定和去除不能同时用)
# fields=('id','title')
# 去除某个或某几个字段不显示
# exclude=('id','publish') #下面这个方法不建议使用(因为不是字段都是要展示给客户看的,还是要使用下面那个方法,可以指定显示哪些字段)
# depth = 1 #深度控制,写 几 往里拿几层,层数越多,响应越慢,官方建议0--10之间,个人建议最多3层 # 重新tiltle字段,进行重命名
# xx = serializers.CharField(source='title') #第二步:查看书对应的所有作者,(再重写authors字段,让其所以作者信息,而不只是显示序列号)
authors=serializers.SerializerMethodField()
def get_authors(self,obj): #obj是一个book对象
ret_authors = obj.authors.all()
# print(ret_authors,type(ret_authors)) ser=AuthorsSerializer(ret_authors,many=True)
return ser.data #同理,查看书对应的的出版社
publish=serializers.SerializerMethodField()
def get_publish(self,obj):
ret_publish= obj.publish
print(ret_publish,type(ret_publish)) #Publish object
ser = PublishSerializer(ret_publish,many=False)
print(ser.data)
return ser.data
RESTful-rest_framework应用第二篇(get、post的序列化与反序列化)的更多相关文章
- Restful framework【第二篇】APIView
安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面安装 方式三:pycharm命令行下安装(装在当前 ...
- 我所理解的RESTful Web API [设计篇]
<我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...
- [转]Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...
- Android开源项目第二篇——工具库篇
本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...
- ElasticSearch入门 第二篇:集群配置
这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念
目录 1. 使用Anypoint Studio开发 2. Mule ESB Application Structure - Mule ESB应用程序结构 3. Mule ESB Application ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...
- (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)
原文地址: http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...
- 深入理解javascript对象系列第二篇——属性操作
× 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...
随机推荐
- 标准IO ——将A文件fpd第3个字节之后的内容复制到文件fps
/* *使用标准IO ——将A文件fpd第3个字节之后的内容复制到文件fps 流程: 1.创建两个流,链接目标文件和源文件 2.输入流的基准点偏移四个单位然后输入缓冲区 3.输出流读取缓冲区数据送入文 ...
- linux 命令——8 cp (转)
cp 命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在, 就会询问是否覆盖,不管你是否使用-i参数.但是如 ...
- 01HTML
1.认识HTML标记 2.元信息标记meta 2.1设置页面关键字 2.2设置页面说明 2.3定义编辑工具 2.4添加作者信息 2.5设置网页文字及语言 2.6设置网页的定时跳转 <html&g ...
- Sum All Odd Fibonacci Numbers-freecodecamp算法题目
Sum All Odd Fibonacci Numbers 1.要求 给一个正整数num,返回小于或等于num的斐波纳契奇数之和. 斐波纳契数列中的前几个数字是 1.1.2.3.5 和 8,随后的每一 ...
- 四、Linux 忘记密码解决方法
Linux 忘记密码解决方法 很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?当然不用!进入单用户模式更改一下root密码即可. 步骤如 ...
- Linux-SSH远程登陆
SSH是什么 Secure Shell 安全外壳协议 建立在应用层基础上的安全协议 可靠.转为远程登陆会话和其他网络提供安全性的协议 SSH客户端是用于多种平台 服务器安装SSH服务 安装:yum i ...
- jenkins+svn+pipeline+kubernetes部署java应用(三)
将jar包.Dockerfile.kubernetes部署yaml文件上传至svn自定义目录 一.生成流水线脚本 二.配置jenkins pipeline构建语句 三.点击构建java工程
- .pyc是什么鬼
.pyc是个什么鬼? 1. Python是一门解释型语言? 我初学Python时,听到的关于Python的第一句话就是,Python是一门解释性语言,我就这样一直相信下去,直到发现了*.pyc文件的存 ...
- django开发基础
一.配置静态文件 https://www.cnblogs.com/lshedward/p/10351051.html 二.路由分发 https://www.cnblogs.com/lshedward/ ...
- 华东交通大学2018年ACM“双基”程序设计竞赛 D
摸鱼之王MIKU酱想去埃及玩,需要一个人陪同.小新和小磊都想陪MIKU酱一起去,但名额只有一个.所以小磊和小新决定用一个小游戏来决定谁和MIKU酱出去玩. 游戏的道具是21张塔罗牌,塔罗牌分 ...