目的是:

  利用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的序列化与反序列化)的更多相关文章

  1. Restful framework【第二篇】APIView

    安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面安装 方式三:pycharm命令行下安装(装在当前 ...

  2. 我所理解的RESTful Web API [设计篇]

    <我所理解的RESTful Web API [Web标准篇]>Web服务已经成为了异质系统之间的互联与集成的主要手段,在过去一段不短的时间里,Web服务几乎清一水地采用SOAP来构建.构建 ...

  3. [转]Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...

  4. Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...

  5. ElasticSearch入门 第二篇:集群配置

    这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  6. EnjoyingSoft之Mule ESB开发教程第二篇:Mule ESB基本概念

    目录 1. 使用Anypoint Studio开发 2. Mule ESB Application Structure - Mule ESB应用程序结构 3. Mule ESB Application ...

  7. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  8. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  9. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

  10. 深入理解javascript对象系列第二篇——属性操作

    × 目录 [1]查询 [2]设置 [3]删除[4]继承 前面的话 对于对象来说,属性操作是绕不开的话题.类似于“增删改查”的基本操作,属性操作分为属性查询.属性设置.属性删除,还包括属性继承.本文是对 ...

随机推荐

  1. ASP.NET的三种开发模式

    前言 ASP.NET 是一个免费的Web开发框架,是由微软在.NET Framework框架中所提供的,或者说ASP.NET是开发Web应用程序的类库,封装在System.Web.dll 文件中.AS ...

  2. 父子组件通信(vuex的方式)

    转: https://blog.csdn.net/lzh5997/article/details/80407518 父子组件也可以通过vuex的进行来进行中转,其实vuex就类似与一个仓库,父组件把东 ...

  3. css布局:块级元素的居中

    一.定宽: 1.定位居中(absolute) 方法一: html: <div class="main"></main> css: .main{ width: ...

  4. java链接MySQL数据库时使用com.mysql.jdbc.Connection的包会出红线问题 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver问题

    package com.swift; //这里导入的包是java.sql.Connection而不是com.mysql.jdbc.Connection import java.sql.Connecti ...

  5. iphone丢失或忘记锁屏密码

    1.首先,我们要保证手机资料已经备份到iColud或者电脑(不想要恢复备份的可跳过该步骤) 2.保证,手机的  设置 → iCloud 处于打开状态: 3.手机的查找iphone软件登录了iColud ...

  6. LAMP 一键部署

    LAMP 一键部署 部署http #!/bin/bash ### global variables export lamp_repo=http://192.168.1.5/lamp/ export l ...

  7. 第六篇:python中numpy.zeros(np.zeros)的使用方法

    用法:zeros(shape, dtype=float, order='C') 返回:返回来一个给定形状和类型的用0填充的数组: 参数:shape:形状 dtype:数据类型,可选参数,默认numpy ...

  8. DevOps - 日志分析 -ELK

    wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-co ...

  9. python3.7 random模块

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 random模块 import random #随机模块 # r ...

  10. python3.7 装饰器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...