图书管理系统:

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

方式一:普通的方式

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. v-if与v-show的区别

    一.区别 v-if 动态的向DOM树内添加或者删除DOM元素:“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:在初始渲染条件为假时,什么也不做. v-sho ...

  2. 撸了个 django 数据迁移工具 django-supertube

    撸了个 django 数据迁移工具 django-supertube 支持字段映射和动态字段转化. 欢迎 star,issue https://github.com/FingerLiu/django- ...

  3. World Wind Java开发之十三——加载Geoserver发布的WMS服务(转)

    这篇是转载的平常心博客,原地址见:http://www.v5cn.cn/?p=171 1.WMSTiledImageLayer类说明 一个WMSTiledImageLayer类对象只能对应一个WMS发 ...

  4. 通过cmd查看环境变量名对应的环境变量值

    在VS环境中通常要添加路径,不过基本都是按照往上提供的方法添加变量名形如:$(VC_IncludePath),但是如何通过cmd命令找到真正的路径呢 未完待续……

  5. Bootstrap 历练实例 - 折叠(Collapse)插件方法

    方法 下面是一些折叠(Collapse)插件中有用的方法: 方法 描述 实例 Options:.collapse(options) 激活内容为可折叠元素.接受一个可选的 options 对象. $(' ...

  6. C# FileStream对象

    FileStream对象表示在磁盘或网络路径上指向文件的流.当类提供向文件读写字节的方法时,经常使用StreamReader或StreamWriter执行这些功能.这是因为FileStream类操作字 ...

  7. linux的一些指令

    linux的一些指令 █查看指令參數man 指令,如:man ls ,按q鍵退出 █查看文件列表ls -lht 按時間排序ll 列表ls 列表 目錄cd 目錄名稱 進入路徑cd .. 返回上層路徑 █ ...

  8. java web用户登录界面

    做这次实验,主要用到了mysql  java web 的 内容 实验代码: IUserDao.java package com.jaovo.msg.dao; import java.util.List ...

  9. Solr7部署报错:java.lang.NoSuchMethodError: javax.servlet.ServletInputStream.isFinished()Z

    错误信息: Servlet.service() for servlet [default] in context with path [/solr] threw exception [Filter e ...

  10. 散列表的ASL计算

    题目: 已知关键字序列为{30,25,72,38,8,17,59},设散列表表长为15.散列函数是H(key)=key MOD 13,处理冲突的方法为二次探测法Hi= ( H(key) + di )m ...