drf视图(代码片段)

zyk01 zyk01     2023-02-14     196

关键词:

目录

请结合【DRF序列化】此文献中的数据文件及序列化文件来阅读如下代码.

DRF视图为我们提供了非常简便的方法——内置了增删改查等一系列的操作.
我们只需在url中指定对应的方法,视图继承内置方法的类,即可实现两三行代码搞定一个请求.

@
*
我们先看看仿照内置方法实现的**

APIView视图文件:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin



""" ===================== 一层封装 ===================== """


class GenericAPIView(APIView):
    queryset = None
    serializer_class = None

    def get_queryset(self):
        """用于获取queryset的方法"""
        return self.queryset.all()

    def get_serializer(self, *args, **kwargs):
        """用于调用序列化类的方法"""
        return self.serializer_class(*args, **kwargs)


class ListModelMixin():
    """用于返回get请求所有数据的数据"""
    def list(self, request):
        queryset = self.get_queryset()  # self调用的方法(get_queryset)是从执行此方法(list)的当前对象的类中开始找
        ser_obj = self.get_serializer(queryset, many=True)  # 原理同上句话
        return Response(ser_obj.data)


class CreateModelMixin():
    """用于处理post请求发来的数据"""
    def create(self, request):
        ser_obj = self.get_serializer(data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)


class RetrieveModelMixin():
    """用于返回get请求查询单条数据方法"""
    def retrieve(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(book_obj)
        return Response(ser_obj.data)


class UpdateModelMixin():
    """用于处理put请求发来的数据(更新数据)"""
    def update(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)


class DestroyModelMixin():
    """用于删除单条数据"""
    def destroy(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        if book_obj:
            book_obj.delete()
            return Response(‘‘)
        return Response(‘The deleted object does not exist.‘)



""" ===================== 二层封装 ===================== """


class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
    pass


class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
    pass

视图文件:

from .custom_mixin import ListCreateAPIView, RetrieveUpdateDestroyAPIView  # 导入上述的APIView视图文件
from DRFView import models
from .serializers import BookSerializer  # 导入自定义的序列化文件


class Book(ListCreateAPIView):
    queryset = models.Book.objects.all()  # 坑:这里的queryset只是放到缓存里了,再次取时还需要用.all()方法
    serializer_class = BookSerializer

    def get(self, request):
        return self.list(request)

    def post(self, request):
        return self.create(request)


class BookEdit(RetrieveUpdateDestroyAPIView):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

    def get(self, request, id):
        return self.retrieve(request, id)

    def put(self, request, id):
        return self.update(request, id)

    def delete(self, request, id):
        return self.destroy(request, id)

改进版

urls.py文件:

urlpatterns = [
    url(r‘^book/$‘, BookModel.as_view(‘get‘: ‘list‘, ‘post‘: ‘create‘)),
    url(r‘^book/(?P<id>d+)/$‘, BookModelView.as_view(‘get‘: ‘retrieve‘, ‘put‘: ‘update‘, ‘delete‘: ‘destroy‘)),
]
"""
注意as_view的传参:
as_view("请求方式": "调用的方法", ...)
指定请求方式调用的方法后,框架会为我们自动执行其方法,无需在CBV中写请求的方法了.
"""

APIView视图文件:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import ViewSetMixin  # 导入DRF封装好的APIView


""" ===================== 第一层封装 ===================== """


class GenericAPIView(APIView):
    queryset = None
    serializer_class = None

    def get_queryset(self):
        """用于获取queryset的方法"""
        return self.queryset.all()

    def get_serializer(self, *args, **kwargs):
        """用于调用序列化类的方法"""
        return self.serializer_class(*args, **kwargs)


class ListModelMixin():
    """用于返回get请求所有数据的数据"""
    def list(self, request):
        queryset = self.get_queryset()  # self调用的方法(get_queryset)是从执行此方法(list)的当前对象的类中开始找
        ser_obj = self.get_serializer(queryset, many=True)  # 原理同上句话
        return Response(ser_obj.data)


class CreateModelMixin():
    """用于处理post请求发来的数据"""
    def create(self, request):
        ser_obj = self.get_serializer(data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)


class RetrieveModelMixin():
    """用于返回get请求查询单条数据方法"""
    def retrieve(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(book_obj)
        return Response(ser_obj.data)


class UpdateModelMixin():
    """用于处理put请求发来的数据(更新数据)"""
    def update(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)


class DestroyModelMixin():
    """用于删除单条数据"""
    def destroy(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        if book_obj:
            book_obj.delete()
            return Response(‘‘)
        return Response(‘The deleted object does not exist.‘)



""" ===================== 第二层封装 ===================== """


class ListCreateAPIView(GenericAPIView, ListModelMixin, CreateModelMixin):
    pass


class RetrieveUpdateDestroyAPIView(GenericAPIView, RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin):
    pass



""" ===================== 第三层封装 ===================== """


class ModelViewSet(ViewSetMixin, ListCreateAPIView, RetrieveUpdateDestroyAPIView):
# ViewSetMixin重写了as_view方法,即可以传参了.
    pass

视图文件:

from .custom_mixin import ModelViewSet  # 导入上述的APIView视图文件
from DRFView import models
from .serializers import BookSerializer  # 导入自定义的序列化文件


class BookModel(ModelViewSet):
    queryset = models.Book.objects.all()  
    # 坑:这里的queryset只是放到缓存里了,再次取时还需要用.all()方法
    # queryset是框架能识别的,会把数据放到缓存中,如果该成其它的名字则不会缓存(比如query),即再此取数据时不能加.all()
    serializer_class = BookSerializer


class BookModelView(ModelViewSet):
    queryset = models.Book.objects.all()
    serializer_class = BookSerializer

接下来,我们再来看看DRF为我们封装好了的APIView用法。
***

开始使用内置视图

第一步 按照框架的要求写url

urlpatterns = [
    url(r‘^book/$‘, BookModel.as_view(‘get‘: ‘list‘, ‘post‘: ‘create‘)),
    # 按照APIView的要求,这里必须写为pk,而不能写id
    url(r‘^book/(?P<pk>d+)/$‘, BookModelView.as_view(‘get‘: ‘retrieve‘, ‘put‘: ‘update‘, ‘delete‘: ‘destroy‘)),
]
"""
注意as_view的传参:
as_view("请求方式": "调用的方法", ...)
指定请求方式调用的方法后,无需在CBV中写请求的方法了.
"""

第二步 写视图文件
```python
from DRFView import models
from .serializers import BookSerializer # 导入自定义的序列化文件
from rest_framework.viewsets import ModelViewSet # 导入DRF封装好的APIView

class BookModel(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer

class BookModelView(ModelViewSet):
queryset = models.Book.objects.all()
serializer_class = BookSerializer

如上步骤,我们的视图只要写两行就可以了.

关于DRF视图源码解析,推荐参考此文献:https://www.cnblogs.com/GGGG-XXXX/articles/9675911.html

继承顺序图解:
技术分享图片
















04drf视图组件(代码片段)

一.视图DjangoRESTframwork提供的视图的主要作用:控制序列化器的执行(检验、保存、转换数据)控制数据库查询的执行1.1视图继承关系1.2视图2个视图基类APIViewGenericAPIView[通用视图类]1.2.1APIViewrest_framework.views.APIViewAPIView是RESTframewor... 查看详情

drf的视图和路由(代码片段)

DRF的视图APIView我们django中写CBV的时候继承的是View,rest_framework继承的是APIView,那么他们两个有什么不同呢~~~urlpatterns= [    url(r‘^book$‘,BookView.as_view()),    url(r‘^book/(?P<i 查看详情

drf框架serializer之视图优化(代码片段)

...列化中,我们通过创建序列化器对象的方式大大地简化了视图函数的代码,前端传入的数据通过反序列化操作进行了各种数据校验,代码如下:fromdjango.httpimportJsonResponsefromdjango.viewsimportViewfromdjango.dbimportconnectionimportjsonfrom.modelsim... 查看详情

drf视图类关系详解(代码片段)

...,request._request#3json模块是否执行反序列化bytes格式#4考你:视图类的方法中:self.request,就是当次请求的request#5Response:类,实例化传一堆参,data=字典,status=状态码( 查看详情

drf视图(代码片段)

目录开始使用内置视图请结合【DRF序列化】此文献中的数据文件及序列化文件来阅读如下代码.DRF视图为我们提供了非常简便的方法——内置了增删改查等一系列的操作.我们只需在url中指定对应的方法,视图继承内置方法的类,... 查看详情

drf序列化器之请求响应以及视图(代码片段)

...ttp请求处理drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作。所以在django原有的django.views.View类基础上,drf封装了多个视图子类出来提供给我们使用。DjangoRESTframwork提供的视图的主要作用:控制序列化器的执... 查看详情

drf4.drf视图开发restfulapi接口(代码片段)

四种方式:函数式编程:functionbasedview类视图:classedbasedview通用类视图:genericclassedbasedviewDRF的视图集Viewsets原生DjangoFBV(Funcitonbasedview)编写,应用的views.pyimportjsonfromdjango.httpimportJsonResponsefromdjango.views.decorators.csrfimportcsrf_exemptcourse... 查看详情

drf之路由系统与视图(代码片段)

手动路由编写#路由fromdjango.conf.urlsimporturlfromapp01.viewsimportUserListViewurlpatterns=[#GET请求查询所有#POST请求增加url(r'^users/$',UserListView.as_view()),url(r'^users.(?P<format>w+)/$',Us 查看详情

学习drf之前(代码片段)

...已经了解过CBV以及FBV什么是FBV和CBV呢~~  FBV基于函数的视图  CBV基于类的视图也就是说我们是用函数编写视图~还是类编写视图~~我们来看下两个的简单实现~~urlpatterns=[path(‘admin/‘,admin.site.urls),path(‘test_fbv‘,t 查看详情

drf视图和路由(代码片段)

APIView:在django中写CBV的时候是继承View,rest_framework继承的是APIView,这两种具体有什么不同呢?urlpatterns=[url(r‘^book$‘,BookView.as_view()),url(r‘^book/(?P<id>d+)$‘,BookEditView.as_view()),]无论是View还是APIView最开始调用的都是as_ 查看详情

0802drf视图(代码片段)

昨日回顾:1.Serializer(序列化)1.ORM对应的query_set和ORM对象转换成JSON格式的数据1.在序列化类中定义自定义的字段:SerializerMethodField在类中定义get_自定义字段名(self,obj)方法2.read_only只在显示(查询)时才会有效。2.对前端POST过来的... 查看详情

drf之视图组件(代码片段)

不断的优化我们写的程序,是每个程序员必备的技能和职业素养,也是帮助我们成长的非常重要的手段。相关知识点相关知识点一:RESTfulapi接口规范我给大家总结的REST的最重要的一句话,那就是:url用来唯一定位资源,http请求... 查看详情

drf视图家族(代码片段)

drf视图家族视图家族- 视图基类,视图工具类,工具视图类,视图集视图基类:APIView、GenericAPIView视图工具类:mixins包下的五个类(六个方法)工具视图类:generics包下的所有GenericAPIView的子类视图集:viewsets包下的类generics中... 查看详情

drf入门规范(代码片段)

...化序列化与反序列化的过程,不仅如此,还提供丰富的类视图、扩展类、视图集来简化视图的编写工作。 查看详情

django-rest-framework---总结(代码片段)

...与反序列化整合(重点)3.整体单改4.单与整体局部修改视图类视图类传递参数给序列化类二次封装Response类视图家族GenericAPIView基类mixins视图工具集-辅助GenericAPIView工具视图视图集GenericAPIView与APIView最为两大继承视图的区别工具... 查看详情

drf框架之视图的扩展类简介(代码片段)

...架,为我们提供的试图扩展类的使用方法即作用。在使用视图扩展类时,需要将mixins模块导入到view文件中。fromrest_frameworkimportmixins并且,在使用视图扩展类时,必须结合GenericAPIView基类一起使用。所谓,视图的扩展类,就是Generi... 查看详情

drf视图组件(代码片段)

一基本视图写一个出版社的增删查改resful接口 路由:url(r‘^publish/$‘,views.PublishView.as_view()),url(r‘^publish/(?P<pk>d+)/$‘,views.PublishDetailView.as_view()),视图:classPublishSerializers(serializers.ModelSerializer):classMeta:model=models.Publishfields=‘_... 查看详情

drf-视图集路由系统action装饰器(代码片段)

1.9个视图扩展类1.两个视图基类:APIView、GenricAPIView2.5个视图扩展类:CreateModelMixin,UpdateModelMixin,RetrieveModelMixin,ListModelMixin,DestroyModelMixin3.9个视图子类:CreateAPIView,DestroyAPIView,ListAPIView,RetrieveAPIView,UpdateAPIView,ListCreateAPIView,RetrieveDestroyAPIVi... 查看详情