图书管理系统:

实现图书接口的增、删、改、查

方式一:普通的方式

views配置:

 #Book的增、删、改、查接口

 class BookSerializer(serializers.ModelSerializer):
class Meta:
model = models.Book
fields = '__all__'
depth = 1 #对get、post请求进行封装
#查看所有图书
class List():
def list(self): ret=self.query_set.objects.all()
ser=self.serila(instance=ret,many=True)
return Response(ser.data)
#创建图书
class Create():
def create(self,request):
back_msg = {'status': 0, 'data': None, 'msg': '错误'}
ser = BookSerializer(data=request.data)
if ser.is_valid():
ser.save()
back_msg['data'] = ser.data
back_msg['status'] = 1
back_msg['msg'] = '创建成功'
return Response(back_msg) #创建书籍类,包含get、post方法(继承上面的List和Create类)
class Book(APIView,List,Create):
query_set=models.Book
serila=BookSerializer
def get(self,request):
return self.list()
def post(self,request):
return self.create(request) #查看(查看单本书)、更新、删除
class BookDetail(APIView):
def get(self,request,pk):
ret= models.Book.objects.filter(pk=pk).first()
ser=BookSerializer(instance=ret,many=False)
return Response(ser.data)
def put(self,request,pk):
ret = models.Book.objects.filter(pk=pk).first()
ser=BookSerializer(instance=ret,data=request.data)
if ser.is_valid():
ser.save()
return Response(ser.data)
def delete(self,request,pk):
models.Book.objects.filter(pk=pk).delete()
return HttpResponse('删除成功')

settings配置:

 REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser']
}

备注:views里面局部的配置信息如下

 #RESTfu自带的处理请求的模块方法
from rest_framework.parsers import JSONParser,FormParser #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))

RESTful自带的模块(处理请求的数据格式)

models配置:

 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

设计数据库表字段信息

url路由配置:

urlpatterns = [
url(r'^admin/', admin.site.urls),
#查看所有图书url(查看所有图书)
url(r'^book/$', views.Book.as_view()),
#指定具体查看某一本书信息(查看、更新、删除等)
url(r'^book/(?P<pk>\d+)', views.BookDetail.as_view()),
]

方式二:实现作者的增删改查

views配置:

 #作者的增删改查
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = models.Author
fields='__all__'
depth = 1 from rest_framework import mixins
from rest_framework.generics import GenericAPIView
#整合了方法一中的List、Create
class Authors(GenericAPIView,mixins.CreateModelMixin,mixins.ListModelMixin):
queryset = models.Author.objects.all()
serializer_class = AuthorSerializer def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request) #设置查看单条数据详情
class AuthorsDetail(APIView):
def get(self,request,pk):
ret=models.Author.objects.filter(pk=pk).first()
ser=AuthorSerializer(instance=ret,many=False)
return Response(ser.data)
#更新单条作者信息
def put(self,request,pk):
ret=models.Author.objects.filter(pk=pk).first()
ser=AuthorSerializer(instance=ret,data=request.data) #注意这里是先拿到新的文件,去覆盖旧的文件
print('即将更新一个出版社信息')
if ser.is_valid():
ser.save()
return Response(ser.data)
#删除单条作者信息
def delete(self,request,pk):
ret=models.Author.objects.filter(pk=pk).delete()
return HttpResponse('删除成功')

url路由配置:

 urlpatterns = [
url(r'^admin/', admin.site.urls),
#查看所有作者
url(r'^authors/$', views.Authors.as_view()),
#查看指定单个作者详情
url(r'^authors/(?P<pk>\d+)', views.AuthorsDetail.as_view()), ]

方式三:

RESTful-rest_framework视图层-第三篇的更多相关文章

  1. 8、Django之模型层第三篇:更多字段与参数

    1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...

  2. Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态

    一.Django请求生命周期 二.路由层  urls.py url()方法 第一个参数其实就是一个正则表达式,一旦前面的正则匹配到了内容,就不会再往下继续匹配,而是直接执行对应的视图函数. djang ...

  3. Django框架之第四篇(视图层)--HttpRequest对象、HttpResponse对象、JsonResponse、CBV和FBV、文件上传

    视图层 一.视图函数 一个视图函数,简称视图,是一个简单的python函数,它接收web请求并且会返回web响应.响应可以是一张网页的html,一个重定向,或者是一张图片...任何东西都可以.无论是什 ...

  4. Python之路【第二十八篇】:django视图层、模块层

    1.视图函数 文件在view_demo 一个视图函数简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应.响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XM ...

  5. 第十二篇视图层之视图函数(views)-三件套

    视图层之视图函数(views) 阅读目录(Content) 视图层之视图函数(views) 一个简单的视图 HttpRequest HttpResponse redirect 函数 对比render与 ...

  6. 【Django】 视图层说明

    [Django视图层] 视图层的主要工作是衔接HTTP请求,Python程序和HTML模板,使他们能够有机互相合作从模型层lou到数据并且反馈.说到视图层的工作就有以下几个方面要说 ■ URL映射 对 ...

  7. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. Django视图层、虚拟环境

    一.虚拟环境安装 目的:为了解决版本共存问题 ''' 1.通过pip3安装虚拟环境: -- pip3 install virtualenv 2.前往目标文件夹: -- cd 目标文件夹 (C:\Vir ...

  9. 第三篇 功能实现(1) (Android学习笔记)

    第三篇 功能实现(1) 第8章 Android应用程序组成 ●Android的一些中.底层基础知识 ※ Android Framework 启动过程 Android手机系统本质上是一个基于Linux的 ...

随机推荐

  1. Extjs4.1+desktop+SSH2 搭建环境 项目能跑起来

    linux开发感觉可能就是日常办公的时候,用别的软件会有问题,java开发还是没什么区别的,换回window开发: push 它: 每次看到右上那红红的叉,我还以为又出错了: 这个项目用resin,下 ...

  2. scrum敏捷开发☞

    scrum是什么?说白了就是自带一些规则的工具,团队成员按照scrum的规则计划项目,执行项目,完成项目..可以让团队提高工作效率 当前除了scrum还有其他很多类似的像Kanban,XP,RUP(规 ...

  3. RobotFramework:钉钉扫码登录UI自动化

    背景: 遇到一个项目,使用的是钉钉扫码登录,一时间不知道该怎么下手了,还是先F12抓包看下都有什么数据传输吧. 分析: 先熟悉下钉钉扫码登录的逻辑,参考官文:https://open-doc.ding ...

  4. fstatfs/statfs详解

    [fstatfs/statfs系统调用]       功能描述:   查询文件系统相关的信息.     用法:   #include <sys/vfs.h>    /* 或者 <sy ...

  5. C++的XML编程经验――LIBXML2库使用指南

    C++的XML编程经验――LIBXML2库使用指南 写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML ...

  6. Linux Shell 几个特殊符号命令 & 、&& 、 ||

    & 放在启动参数后面表示设置此进程为后台进程 默认情况下,进程是前台进程,这时就把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动 ...

  7. vue axios请求频繁时取消上一次请求

    一.前言 在项目中经常有一些场景会连续发送多个请求,而异步会导致最后得到的结果不是我们想要的,并且对性能也有非常大的影响.例如一个搜索框,每输入一个字符都要发送一次请求,但输入过快的时候其实前面的请求 ...

  8. WebSocket 详解

    WebSocket 出现前 构建网络应用的过程中,我们经常需要与服务器进行持续的通讯以保持双方信息的同步.通常这种持久通讯在不刷新页面的情况下进行,消耗一定的内存资源常驻后台,并且对于用户不可见.在 ...

  9. 最新手机号正则表达式php包括166等号段

    if(!preg_match("/^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147)) ...

  10. h5中的video与audio

    ·首先带大家熟悉一下video标签的属性方法,根据属性方法做一个小demo, HTML5支持的视频格式: Ogg 带有Theora视频编码+Ogg文件 支持的浏览器:F.O MEPG4  带有H.26 ...