DRF框架学习笔记

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类,使针对不同资源(表)的接口可以更快捷的开发,只需要修改querysetserializer_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
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值