restful知识点之二restframework视图
restful协议理解:面向资源开发
restful协议
---- 一切皆是资源,操作只是请求方式
----book表增删改查
/books/ books
/books/add/ addbook
/books/(\d+)/change/ changebook
/books/(\d+)/delete/ delbook
----book表增删改查
/books/ -----get books ----- 返回当前所有数据
/books/ -----post books ----- 返回提交数据
/books/(\d+)-----get bookdetail ----- 返回当前查看的单条数据
/books/(\d+)-----put bookdetail ----- 返回更新数据
/books/(\d+)-----delete bookdetail ----- 返回空
class Books(View):
def get(self,request):
pass # 查看所有书籍
def post(self,request):
pass # 添加书籍
class BooksDetail(View):
def get(self,request,id):
pass # 查看具体书籍
def put(self,request,id):
pass # 更新某本书籍
def delete(self,request,id):
pass # 删除某本书籍
restful协议理解
安装restframework
pip3 install djangorestframework
Django序列化方式
# 方式1:
# publish_list=list(Publish.objects.all().values("name","email")) # 方式2:
# from django.forms.models import model_to_dict
# publish_list=Publish.objects.all()
# temp=[]
# for obj in publish_list:
# temp.append(model_to_dict(obj)) # 方式3:(使用django框架的serializers方法)
# from django.core import serializers # ret=serializers.serialize("json",publish_list) 方式4:使用rest_framework进行序列化
功能1:从querySet--->json
功能2:从json---->querySet 步骤1:from rest_framework import serializers
步骤2:用modelserializer(类似modelForm)
序列化querySet:
book_list=Book.objects.all()
bs=BookSerializers(book_list,many=True)
序列化对象:
obj=Book.objects.filter(pk=id).first()
bs=BookSerializers(obj)
备注:需要继承APIView类才能与rest-framwork序列化类相配合使用
一、初级处理视图方式
urls.py;两个url 一个处理全部数据,一个处理单条数据
处理全部数据:
get与post
处理单条数据
get、put(更新)与delete
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Books/$', views.Books.as_view(),name='book'),
url(r'^Books_detail/(\d+)/$', views.Book_detail.as_view(),name='Books_detail'),
url(r'^Author/$', views.AuthorView.as_view(),name='Author'),
url(r'^AuthorDetail/(\d+)/$', views.perBookView.as_view(),name='AuthorDetail'), ]
views.py:
from django.shortcuts import render,HttpResponse,redirect
from app01.serilizer import *
from django.views import View
from app01.models import *
from rest_framework.response import Response
from rest_framework import serializers
# Create your views here.
from rest_framework.views import APIView from rest_framework import mixins
from rest_framework import generics
全部视图查看处理类
class Books(APIView):
def get(self,request):
book_list=Book.objects.all()
bs=BookSerializers(book_list,many=True)
return Response(bs.data) def post(self,request):
bs=BookSerializers(data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors) 某条数据处理类
class Book_detail(APIView):
def get(self,request,id):
obj=Book.objects.filter(pk=id).first()
bs=BookSerializers(obj)
return Response(bs.data) def put(self,request,id):
obj=Book.objects.filter(pk=id).first()
bs=BookSerializers(obj,data=request.data)
if bs.is_valid():
bs.save()
return Response(bs.data)
else:
return Response(bs.errors) def delete(self,request,id):
Book.objects.filter(pk=id).delete()
return Response() class AuthorView(APIView):
def get(self,request):
author_list=Author.objects.all()
bs=Authorserializers(author_list,many=True)
return Response(bs.data) def post(self,request): ps=Authorserializers(data=request.data)
if ps.is_valid():
print(ps.validated_data)
ps.save() # create方法
return Response(ps.data)
else:
return Response(ps.errors) class perBookView(APIView):
#查看一条
def get(self,request,id):
authors_obj=Author.objects.filter(pk=id).first()
aa=Authorserializers(authors_obj)
return Response(aa.data) #更新一条
def put(self,request,id):
obj=Author.objects.filter(pk=id).first()
sobj=Authorserializers(obj,data=request.data)
if sobj.is_valid():
sobj.save()
return Response(sobj.data)
else:
return Response(sobj.errors) #删除一条
def delete(self,request,id):
Author.objects.filter(pk=id).delete()
return Response()
数据库
from django.db import models # Create your models here.
from django.db import models # Create your models here. class Book(models.Model):
title=models.CharField(max_length=32)
price=models.IntegerField()
pub_date=models.DateField(null=True)
publish=models.ForeignKey("Publish")
authors=models.ManyToManyField("Author")
def __str__(self):
return self.title 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
使用rest_framework序列化前转化成类方式
from rest_framework import serializers
from app01.models import *
class Authorserializers(serializers.ModelSerializer):
class Meta:
model=Author
fields="__all__" class BookSerializers(serializers.ModelSerializer):
class Meta:
model=Book
fields='__all__'
二、mixin类处理视图方式
generics.GenericAPIView继承了APIView,扩写的方法有:
处理全部数据:
get全部: mixins.ListModelMixin,
post: mixins.CreateModelMixin 处理单条数据:
get某条: mixins.RetrieveModelMixin
put(修改某条): mixins.UpdateModelMixin
delete(删除某条): mixins.DestroyModelMixin
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^Publishs/$', views.Publishs.as_view()),
url(r'^Publish_detail/(?P<pk>\d+)/$', views.PublishDetail.as_view())
urls.py
from django.db import models # Create your models here.
from django.db import models # Create your models here. class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32) class Token(models.Model):
user=models.OneToOneField("User")
token = models.CharField(max_length=128) def __str__(self):
return self.token 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 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
models.py
from app01.models import *
from rest_framework import serializers class Publishkserializer(serializers.ModelSerializer):
class Meta:
model=Publish
fields='__all__'
from app01.myserializer import *
# Create your views here.
from rest_framework import mixins
from rest_framework import generics
from django.views import View
from rest_framework.views import APIView
from app01.models import * #1mixin类编写视图--------------------------------- class Publishs(mixins.ListModelMixin,
mixins.CreateModelMixin,
generics.GenericAPIView):#扩写了APIView
#必须是固定死的queryset
queryset = Publish.objects.all()
print('queryset---------------------',queryset)
#必须是serializer_class
serializer_class = Publishkserializer
print(serializer_class, '') def get(self, request, *args, **kwargs):
print('')
return self.list(request, *args, **kwargs) def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs) class PublishDetail(mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,generics.GenericAPIView):
queryset = Publish.objects.all()
print(queryset,'')
serializer_class = Publishkserializer def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs) def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs) def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
views.py
三、基于通用类的处理视图方式
相比mixin视图处理方式
处理全部数据:
generics.ListCreateAPIView
处理单条: generics.RetrieveUpdateDestroyAPIView
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^Author/$', views.Authors.as_view()),
url(r'^Author_detail/(?P<pk>\d+)/$', views.AuthorDetail.as_view()), ]
urls.py
#2使用通用的基于类的视图---------------------------------------
from rest_framework import mixins
from rest_framework import generics
from app01.models import *
from app01.myserializer import *
class Authors(generics.ListCreateAPIView): queryset = Author.objects.all()
# print(queryset,'111111111111')
print(queryset,'')
serializer_class = Authorserializer class AuthorDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Author.objects.all()
serializer_class = Authorserializer
views.py
from django.db import models # Create your models here.
from django.db import models # Create your models here. class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32) class Token(models.Model):
user=models.OneToOneField("User")
token = models.CharField(max_length=128) def __str__(self):
return self.token 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 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
models.py
from app01.models import *
from rest_framework import serializers
class Authorserializer(serializers.ModelSerializer):
class Meta:
model=Author
fields='__all__'
四、viewsets.ModelViewSet
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [ url(r'^Authors/$', views.AuthorsViewSet.as_view({"get": "list", "post": "create"}), name="book_list"),
url(r'^Authors/(?P<pk>\d+)/$', views.AuthorsViewSet.as_view({
'get': 'retrieve',
'put': 'update',
'patch': 'partial_update',
'delete': 'destroy'
}), name="book_detail"), ]
urls.py
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets
from app01.models import *
from app01.myserializer import *
class AuthorsViewSet(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = Authorserializer
views.py
from django.db import models # Create your models here. class User(models.Model):
name=models.CharField(max_length=32)
pwd=models.CharField(max_length=32) class Token(models.Model):
user=models.OneToOneField("User")
token = models.CharField(max_length=128) def __str__(self):
return self.token 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
models.py
from app01.models import *
from rest_framework import serializers class Publishkserializer(serializers.ModelSerializer):
class Meta:
model=Publish
fields='__all__' class Bookserializer(serializers.ModelSerializer):
class Meta:
model=Book
fields='__all__' class Authorserializer(serializers.ModelSerializer):
class Meta:
model=Author
fields='__all__'
myserializer.py
五注册方式

restful知识点之二restframework视图的更多相关文章
- arcgis api 4.x for js 自定义 Draw 绘制手绘面以及手绘线,只针对二维视图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...
- C#开发BIMFACE系列28 服务端API之获取模型数据13:获取三维视点或二维视图列表
系列目录 [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取一个模型中包含的三维视点或二维视图列表. 请求地址:GET https://api.bimface.com/data/v2/ ...
- java基础知识点补充---二维数组
#java基础知识点补充---二维数组 首先定义一个二维数组 int[][] ns={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} }; 实现遍 ...
- restful知识点之六rest-framework组件流程图
- restful知识点之三restframework认证-->权限-->频率
认证.权限.频率是层层递进的关系 权限业务时认证+权限 频率业务时:认证+权限+频率 局部认证方式 from django.conf.urls import url,include from djan ...
- restframework 视图
重要知识点 as_view()获取的是view方法名,当url配版成功,执行view方法 一.逻辑封装(mixins, generics) path('author/', views.AuthorVi ...
- 前端新人学习笔记-------html/css/js基础知识点(二)
4月7日学到的知识点: 一:<img src="1.png" alt="美女"/> alt是给图片添加介绍,当图片没加载出来时,会直接显示a ...
- Django编写RESTful API(二):请求和响应
欢迎访问我的个人网站:www.comingnext.cn 前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每一个URL代表着一个资源.当然我 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
随机推荐
- ios真机测试问题
前端页面在ios端真机测试出现的问题 由于苹果对于性能的要求是近乎苛刻,如果没有可点的特性的元素系统默认不会给它响应事件,因此真机测试时容易添加不上绑定事件 解决办法: 1.通过js判断当前是否为苹果 ...
- Three.js 前言
-----------------------------------本文非技术文章,着急开发的小伙伴请绕道----------------------------------------- 最近公司 ...
- SpringBoot + Spring MVC国际化使用示例
项目中需要显示中英文两种语言,所以需要对显示的内容进行国际化,如下是一个示例程序. 程序文件结构,如下图,后面详细列出各文件的代码. 1. 编写maven的pom.xml文件,如下: <proj ...
- Unity5 2D Animation
1. 所有的动画保存在 .anim 后缀的文件里.2. Animation 标签用来编辑一堆 Animation clip,每一个clip是一个图片序列,也就是动图.动画的最小控制单位就是clip,一 ...
- DP Intro - poj 2342 Anniversary party
今天开始做老师给的专辑,打开DP专辑 A题 Rebuilding Roads 直接不会了,发现是树形DP,百度了下了该题,看了老半天看不懂,想死的冲动都有了~~~~ 最后百度了下,树形DP入门,找到了 ...
- putty访问虚拟机
从宿主机中用putty连接虚拟机中的Ubuntu Server. putty默认使用ssh方式连接,这需要在Ubuntu Server中安装ssh服务.使用命令sudo apt-get install ...
- 我的Python升级打怪之路【六】:面向对象(二)
面向对象的一些相关知识点 一.isinstance(obj,cls) 检查实例obj是否是类cls的对象 class Foo(object): pass obj = Foo() isinstance( ...
- 九度oj 1002 Grading 2011年浙江大学计算机及软件工程研究生机试真题
#include<iostream> #include<queue> #include<cstdio> #include<cstring> #inclu ...
- Memcached 查询stats及各项状态解释
一.两个最常用状态查询(掌握第一个就完全OK了) 1)查看状态:printf “stats\r\n” |nc 127.0.0.1 11211 2)模拟top命令查看状态:watch “ech ...
- ComboBox ItemHeight 再高一点
public static void BindData(this ComboBox box, List<KeyValuePair<long, string>> data) { ...