DRF中的视图集的使用

1、说明:DRF框架中的视图集:

  在drf开发接口中,使用GenericAPIView和视图扩展类结合起来完成接口功能是一件很常见的事情,
所以,drf的作者帮我们提前把  GenericAPIView和视图扩展类结合子类也声明了出来
视图子类中还帮我们定义对应接口的视图方法代码,所以我们无需在视图中重复编写对用的视图方法了。
案例代码:

view.py

from rest_framework.generics import ListAPIView,CreateAPIView # ListAPIView是 GernericAPIView和ListModelMixin的组合子类
class BookInfoSonAPIView(ListAPIView,CreateAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

# from rest_framework.generics import RetrieveAPIView,UpdateAPIView,DestroyAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView # 等同于上面同时引入的三个视图子类
class BookInfo2SonAPIView(RetrieveUpdateDestroyAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

urls.py

 # urls.py
 
   path("books4/", views.BookInfoSonAPIView.as_view()),
    re_path("books4/(?P<pk>\d+)/", views.BookInfo2SonAPIView.as_view()),
 
 2:ViewSet视图集的使用

#继承使用ListAPIView,CreateAPIView,虽然方便,但是明显可以看到,类属性重复了,
# 如果把两个类的视图都放在一个类下,那么就只能实现一个类视图对应一个http请求的情况
# 所以drf中提供了视图集帮助我们改变路由和视图方法的绑定关系来解决,即是,通过在视图函数中
# 来自定义自己写的函数,然后再在路由中改变绑定关系。使其对应不同的http请求


#views.py
from rest_framework.viewsets import ViewSet
from booktest.models import BookInfo
from app01.serializers import BookInfoModelSerializer
from rest_framework.response import Response
class BookInfoAPIViewSet(ViewSet):
    def get_list(self,request): # 获取所有数据
        # 三步走:
        # 第一步:操作数据
        books=BookInfo.objects.all()
        # 第二步:序列化
        serializer=BookInfoModelSerializer(instance=books,many=True)
        # 第三步:响应数据
        return Response(serializer.data)

    # 获取一条数据
    def get_one(self,request,pk):
        # 三步骤
        # 第一步:操作数据库
        book=BookInfo.objects.get(pk=pk)
        # 第二步:序列化
        serializer=BookInfoModelSerializer(instance=book)
        # 第三步:响应信息
        return Response(serializer.data)

    # 获取前五条数据
    def get_top5(self,request):
        # 三步骤
        # 第一步:操作数据
        books=BookInfo.objects.order_by("-bread")[:5] # 依据阅读数量查询数据
        # 第二步:序列化
        serializer=BookInfoModelSerializer(instance=books,many=True)
        # 第三步:响应信息
        return Response(serializer.data)

urls.py

from django.urls import path,re_path
from . import views

urlpatterns=[
# 获取所有数据要走的路由
    path("book04/",views.BookInfoAPIViewSet.as_view({"get":"get_list"})),

    #获取一条数据
    re_path("book05/(?P<pk>\d+)/", views.BookInfoAPIViewSet.as_view({"get":"get_one"})),

    # 查询前五条数据
    path("book06/top5/", views.BookInfoAPIViewSet.as_view({"get": "get_top5"})),

]
 3、GenericViewSet的使用

# 使用ViewSet通常并不方便,因为listretrievecreateupdatedestory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,
# 所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与`GenericAPIView`,所以还需要继承`GenericAPIView`
# **GenericViewSet**就帮助我们完成了这样的继承工作,继承自`GenericAPIView``ViewSetMixin`,在实现了调用as_view()时传入字典
# (如`{'get':'list'}`)的映射处理工作的同时,还提供了`GenericAPIView`提供的基础方法,可以直接搭配Mixin扩展类使用。


views.py
"""上面的代码又回到了最初的APIView时代,所以我们可以使用GenericViewSet来简化"""
from rest_framework.viewsets import GenericViewSet
from booktest.models import BookInfo
from app01.serializers import BookInfoModelSerializer
from rest_framework.response import Response
from rest_framework.mixins import ListModelMixin,RetrieveModelMixin
class BookInfoGenericViewSet(GenericViewSet,ListModelMixin,RetrieveModelMixin):
    # GenericViewSet 继承了GnericAPIView 所以必须要有以下两个参数
    queryset = BookInfo.objects.all() # 指明当前操作的模型数据是什么,
    serializer_class = BookInfoModelSerializer # 指明用的是什么序列化器

    def get_list(self,request):
        # 获取所有数据
        return self.list(request)  # 当前类的方法list,继承了GenricAPIVIew

    def get_one(self,request,pk):
        # 获取一条数据
        return self.retrieve(request,pk)

urls.py

from django.urls import path,re_path
from . import views

urlpatterns=[
# 查询所有数据
    path("book07/", views.BookInfoGenericViewSet.as_view({"get": "get_list"})),
    # 查询一条数据
    re_path("book07/(?P<pk>\d+)/", views.BookInfoGenericViewSet.as_view({"get": "get_one"})),

]
4、ModelViewSet的使用

继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

"""对于上面虽然虽然已经简化了很多代码,但是drf中针对常用的5个接口,事实上有提供了预设类给我们直接使用"""
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
from booktest.models import BookInfo
from .serializers import BookInfoModelSerializer
from rest_framework.response import Response
class BookInfoModelViewSet(ModelViewSet):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoModelSerializer

    def get_top_5(self,request):
        """获取评论值最多的5条数据"""
        # 操作数据库
        print(self.action) # 获取本次请求的视图方法名
        books = BookInfo.objects.order_by("-bread")[:5]
        # 序列化
        serializer = BookInfoModelSerializer(instance=books,many=True)
        # 3, 响应数据
        return Response(serializer.data)

urls.py

from django.urls import path, re_path
from . import views
urlpatterns = [
    # 针对ModelViewSet提供的5个视图方法,路由以下:
  # 针对ModelViewSet提供的5个视图方法,路由以下:
path("books08/", views.BookInfoModelViewSet.as_view({"get":"list"})),
path("books08/", views.BookInfoModelViewSet.as_view({"post":"create"})),
path("books08/top5/", views.BookInfoModelViewSet.as_view({"get":"get_top_5"})),
re_path("books08(?P<pk>\d+)/", views.BookInfoModelViewSet.as_view({"get":"retrieve"})),
re_path("books08(?P<pk>\d+)/", views.BookInfoModelViewSet.as_view({"put":"update"})),
re_path("books08/(?P<pk>\d+)/", views.BookInfoModelViewSet.as_view({"delete":"destroy"})),
]

 



 

转载于:https://www.cnblogs.com/one-tom/p/11347101.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值