FBV
FBV是最基本的请求分发模式,通过判断request中的method分发视图流程
#views.py
from django.shortcuts import render,HttpResponse
from .models import Book
# Create your views here.
# FBV面向过程编程
def getList(request):
if request.method =='GET':
# queryset = Book.objects.all()
return HttpResponse('GET请求已返回')
elif request.method =='POST':
# queryset = Book.objects.all()
return HttpResponse('POST请求已返回')
#---------------------------------------------------------
# urls.py
from django.urls import path
from . import views
urlpatterns=[
path('getList/',views.getList)
]
CBV
CBV是通过as_view()函数调用其内部的view方法,而view方法的返回值是self.dispatch方法,通过这个方法返回其路由方法
这种根据url来匹配方法的是通过反射方法(getattr)来做的。请求过来后先走dispatch这个方法,这个方法存在View类中。(本质也是FBV)
# views.py
from django.views import View
class Bookview(View):
def get(self,request):
quertset= models.Book.objects.all()
print(quertset)
data_list=[]
for item in quertset:
data_list.append({
"title":item.title,
"summer":item.summer,
"author":item.author,
})
return HttpResponse(data_list)
def post(self,request):
return HttpResponse('cbv POST')
#---------------------------------------------------
#urls.py
from django.urls import path
from . import views
urlpatterns=[
path('getList/',views.getList),
path('cbvgetbook/',views.Bookview.as_view())
]
DRF
DRF在构建初始化类的时候,继承的并非view而是APIview,APIview内部又继承了view类,重写了dispatch方法,主要作用是重新返回了request,使其可以接收的数据类型增多。
#--------------------------------------rest_framework------------
#views.py
from rest_framework.views import APIView
from django.views import View
class Bookview(APIView):
def get(self,request):
print(request)
return HttpResponse('APIView GET')
def post(self,request):
return HttpResponse('APIView POST')
#---------------------------------------------------------------------
#urls.py保持不变
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
序列化器
使用基本的
from rest_framework.views import APIView
from rest_framework import serializers
from rest_framework.response import Response
from .models import Book
# Create your views here.
class BookSerializers(serializers.Serializer):
'''构建序列化器'''
title = serializers.CharField(max_length=100)
summer = serializers.CharField()
author = serializers.CharField()
class Bookview(APIView):
def get(self,request):
book_list = Book.objects.all()
#实例化序列化器
# instance用于构架序列化, data用于反序列化
sers_list=BookSerializers(instance=book_list,many = True)
return Response(sers_list.data)
def post(self,reques):
pass
GenericAPIView
GenericAPIView继承了APIView类,使针对不同资源(表)的接口可以更快捷的开发,只需要修改queryset和serializer_class 即可完成快速开发
#----------------------------基于GenericAPIView 实现 ----------------------
from rest_framework.generics import GenericAPIView
class ahtorSerializer(ModelSerializer):
class Meta:
model = Author
fields= '__all__'
class authorView(GenericAPIView):
queryset = Author.objects.all()
serializer_class=ahtorSerializer
def get(self,request):
# serializerList = ahtorSerializer(instance= Author.objects.all(),many = True)
serializerList = self.get_serializer(instance = self.get_queryset(),many = True)
return Response(serializerList.data)
def post(self,request):
# serializerList =ahtorSerializer(data=request.data)
serializerList =self.get_serializer(data=request.data)
if serializerList.is_valid():
serializerList.save()
return Response(serializerList.data)
else:
return Response(serializerList.errors)
class authorDatilView(GenericAPIView):
queryset = Author.objects.all()
serializer_class=ahtorSerializer
def get(self,request,pk):
serializerList = self.get_serializer(instance=self.get_object(),many=False)
return Response(serializerList.data)
def put(self,request,pk):
serializerList=self.get_serializer(instance=self.get_object(),data=request.data)
if serializerList.is_valid():
serializerList.save()
return Response(serializerList.data)
else:
return Response(serializerList.errors)
def delete(self,request,pk):
self.get_object().delete()
return Response()
mixins混合类
from rest_framework.mixins import CreateModelMixin,ListModelMixin,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin
# from rest_framework.generics import GenericAPIView
# 可以使用再次封装的混合类
# from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
# ListModelMixin 获取所有资源
# CreateModelMixin 创建资源
# RetrieveModelMixin 查询单个资源
# UpdateModelMixin 更新单个资源
# DestroyModelMixin 删除单个资源
class ahtorSerializer(ModelSerializer):
class Meta:
model = Author
fields= '__all__'
class authorView(GenericAPIView,CreateModelMixin,ListModelMixin):
queryset = Author.objects.all()
serializer_class=ahtorSerializer
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
class authorDatilView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Author.objects.all()
serializer_class=ahtorSerializer
def get(self,request,pk):
return self.retrieve(request,pk)
def put(self,request,pk):
return self.update(request,pk)
def delete(self,request,pk):
return self.destroy(request,pk)
viewset
viewset主要重写了as_view()方法,使得可以自己映射请求的分发
# urls.py
from django.urls import path,include
from . import views
urlpatterns = [
# Viewset
path('author/',views.authorView.as_view({"get":"get_all","post":"add_object"})),
path('author/<int:pk>',views.authorView.as_view({"get":"get_object","put":"put_object","delete":"delete_object"}))
]
# views.py
from rest_framework.viewsets import ViewSet
class ahtorSerializer(ModelSerializer):
class Meta:
model = Author
fields= '__all__'
class authorView(ViewSet):
queryset = Author.objects.all()
serializer_class=ahtorSerializer
def get_all(self,request):
return Response('获取所有资源')
def add_object(self,request):
return Response('新增单个资源')
def get_object(self,request,pk):
return Response('获取单个资源')
def put_object(self,request,pk):
return Response('更新单个资源')
def delete_object(self,request,pk):
return Response('删除单个资源')
ModelViewSet
modelViewSet在内部直接重写好了各个请求的路由,使得映射关系变得更加简单
# urls.py
from django.urls import path,include
from . import views
urlpatterns = [
# path('author/',views.authorView.as_view()),
# path('author/<int:pk>',views.authorDatilView.as_view())
# modelViewset
path('author/',views.authorView.as_view({"get":"list","post":"create"})),
path('author/<int:pk>',views.authorView.as_view({"get":"retrieve","put":"update","delete":"destroy"}))
]
# views.py
from rest_framework.viewsets import ModelViewSet
class ahtorSerializer(ModelSerializer):
class Meta:
model = Author
fields= '__all__'
class authorView(ModelViewSet):
queryset = Author.objects.all()
serializer_class=ahtorSerializer