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 知识点进行复习和学习一番,大 ...
随机推荐
- springcloud(三)-Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- MqttNet 通讯
MQTT,IBM发明的物联网通讯协议基于tcp ip , 收集传感器上的数据. 下图理解: broker 这里有很多消息,根据主题不同来进行区分,它这里可以保管所有连过来的客户端的数据,然后客户端, ...
- 小程序 - 分包加载上限8M(一)
使用分包 配置方法 假设支持分包的小程序目录结构如下 ├── app.js ├── app.json ├── app.wxss ├── packageA │ └── pages │ ├── c ...
- Java_方法的调用②及案例
语法格式: 方法名称([参数列表]); //注意:只能调用本类的方法 案例: class Method01{ public static void print(){ for(int i = 1; i ...
- ios 得到每周的星期一开始和星期天结束的日期
得到每周 星期一零点(即本周的开始) 和星期天 24 点(即本周的结束和下一周的开始)的时间 NSDate *now = [NSDate date]; NSCalendar *calendar = [ ...
- 九度oj题目1019:简单计算器
题目1019:简单计算器 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6346 解决:2334 题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达 ...
- Android OpenGL教程-第三课【转】
第三课 给多边形上色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在左图中,三角形用的是光滑着色,四边形用的是平面着色. 这次增加的代码不算多. 增加一个color的buffer ...
- JSON跨域问题总结
一.跨域问题的原因: 1 浏览器的检查 2 跨域 3 XMLHttpRequest请求二.跨域问题的解决: 1 禁止浏览器检查:使用dos命令,在启动浏览器的时候,加一个参数:chrome --dis ...
- 【JSON.parse()和JSON.stringify()】
var str = '{"name":"huangxiaojian","age":"23"}' 结果: JSON.par ...
- Silverlight & Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
在Silverlight中自身并没有提供拖放功能的相关实现,要实现拖放功能得借助其事件支持(MouseLeftButtonDown.MouseLeftButtonUp和MouseMove)来完成,实际 ...