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]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...
随机推荐
- LeetCode Unique Binary Search Trees (DP)
题意: 一棵BST有n个节点,每个节点的key刚好为1-n.问此树有多少种不同形态? 思路: 提示是动态规划. 考虑一颗有n个节点的BST和有n-1个节点的BST.从n-1到n只是增加了一个点n,那么 ...
- LeetCode Remove Element删除元素
class Solution { public: int removeElement(int A[], int n, int elem) { ]; int i,num=n; ;i<n;i++){ ...
- IOS Quartz2D自定义view
@property (nonatomic, weak) UIImageView *imageView; @property (nonatomic, weak) NJImageView *njIv; @ ...
- 【HHHOJ】NOIP2018 模拟赛(二十四) 解题报告
点此进入比赛 得分: \(100+60+100\)(挺好的,涨了一波\(Rating\)) 排名: \(Rank\ 1\) \(Rating\):\(+115\) \(T1\):[HHHOJ13]金( ...
- Jquery动态添加多行,返回数据至每一行中
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="sys_channel_ed ...
- ASIHTTPRequest的使用
本文转自csdn ASIHTTPRequest对CFNetwork API进行了封装,并且使用起来非常简单,用Objective-C编写,可以很好的应用在Mac OS X系统和iOS平台的应用程序中. ...
- Express中间件简单的实现原理
上一篇理解Express的使用之后, 再总结一篇Express中间件的简单实现原理. 我们知道Express中间件就是一个个的函数, 那么怎么让这些函数有序的执行呢? 那就需要我们调用 next 函数 ...
- 学习笔记(六): Regularization for Simplicity
目录 Overcrossing? L₂ Regularization Lambda Examining L2 regularization Check Understanding Glossay Ov ...
- 如何查看连接到手机热点的ip地址
因为最近玩树莓派,需要手机做热点,然后用树莓派连接到这个热点上,苦于不知道树莓派被分配了什么样的ip地址,经过一番探索,我发现了两种办法, 安装一个 android terminal( 安卓命令行), ...
- 如何使用koa实现socket.io官网的例子
socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下 ### 框架准备 确保你本地已经安装好了nodejs和npm,使用koa要求node版本> ...