rest-framework之视图和源码解析

视图和源码解析

通过使用mixin类编写视图:

from rest_framework import mixins
from rest_framework import generics

class BookViewSet(mixins.ListModelMixin,
                  mixins.CreateModelMixin,
                  generics.GenericAPIView):

    queryset = Book.objects.all()
    serializer_class = BookSerializers

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

class BookDetailViewSet(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

    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)

使用通用的基于类的视图

通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步。REST框架提供了一组已经混合好(mixed-in)的通用视图,我们可以使用它来简化我们的views.py模块。

from rest_framework import mixins
from rest_framework import generics

class BookViewSet(generics.ListCreateAPIView):

    queryset = Book.objects.all()
    serializer_class = BookSerializers

class BookDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers

class PublishViewSet(generics.ListCreateAPIView):

    queryset = Publish.objects.all()
    serializer_class = PublshSerializers

class PublishDetailViewSet(generics.RetrieveUpdateDestroyAPIView):
    queryset = Publish.objects.all()
    serializer_class = PublshSerializers

还有更简洁的写法:

views.py

class AuthorModelView(ModelViewSet):

    queryset=Author.objects.all()
    serializer_class=AuthorSerializers

urls.py

    url(r‘^authors/$‘, views.AuthorModelView.as_view({"get":"list","post":"create"})),
    url(r‘^authors/(?P<pk>\d+)/$‘, views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"})),

serializers.py

class AuthorSerializers(serializers.ModelSerializer):
    class Meta:
        model=Author
        fields="__all__"

那么来看看源码吧

serializers.ModelSerializer

以CreateModelMixin为例

再看看 GenericViewSet:

先看 ViewSetMixin ,其中定义了 as_view方法,因为该类在 generics.GenericAPIView之前定义,所以 cls.as_view 时会调用此方法:

看下 as_view 里的view 做了些什么,该类并没有定义 dispatch方法 :

再来看下 GenericAPIView 该类并没有 dispatch 方法,但是继承了 APIView,所以我们view会调用 APIView 的 dispatch方法

在 GenericAPIView 中你需要设置或覆盖的get_queryset() 、 get_serializer_class()。

如果你重写了一个视图方法,那么你应该调用‘getqueryset()‘而不是直接访问‘queryset‘属性,

因为对于所有后续的请求“queryset”只会被评估一次,并且会缓存这些结果

APIView这里就不多说了,上次写过了,看这个吧  Django APIView源码解析

再看看 mixins.UpdateModelMixin 吧,这个和删除,个查单个有共通之处,区别于list和create

这个 get_object()方法是在 GenericAPIView 里的

原文地址:https://www.cnblogs.com/95lyj/p/9439435.html

时间: 2024-10-29 12:07:00

rest-framework之视图和源码解析的相关文章

Django的rest_framework的视图之基于ModelViewSet视图源码解析

前言 今天一直在整理Django的rest_framework的序列化组件,前面一共写了2篇博客,前面的博客给的方案都是一个中间的状态的博客,其中有很多的冗余的代码,如果有朋友不清楚,可以先看下我前面的博客 第一篇,使用minix类来实现序列化和反序列化 https://www.cnblogs.com/bainianminguo/p/10463741.html 第二篇,使用通用的类的方法实现序列化和反序列化 https://www.cnblogs.com/bainianminguo/p/1046

Google Test(GTest)使用方法和源码解析——模板类测试技术分析和应用

写C++难免会遇到模板问题,如果要针对一个模板类进行测试,似乎之前博文中介绍的方式只能傻乎乎的一个一个特化类型后再进行测试.其实GTest提供了两种测试模板类的方法,本文我们将介绍方法的使用,并分析其实现原理.(转载请指明出于breaksoftware的csdn博客) 应用 GTest将这两种方法叫做:Typed Tests和Type-Parameterized Tests.我觉得可能叫做简单模式.高级模式比较通用.先不管这些名字吧,我们看看怎么使用 简单模式(Typed Tests) 首先我们

Google Test(GTest)使用方法和源码解析——参数自动填充技术分析和应用

在我们设计测试用例时,我们需要考虑很多场景.每个场景都可能要细致地考虑到到各个参数的选择.比如我们希望使用函数IsPrime检测10000以内字的数字,难道我们要写一万行代码么?(转载请指明出于breaksoftware的csdn博客) EXPECT_TRUE(IsPrime(0)); EXPECT_TRUE(IsPrime(1)); EXPECT_TRUE(IsPrime(2)); ...... EXPECT_TRUE(IsPrime(9999)); 这种写法明显是不合理的.GTest框架当然

Dubbo原理和源码解析之服务暴露

一.框架设计 在官方<Dubbo 用户指南>架构部分,给出了服务调用的整体架构和流程: 另外,在官方<Dubbo 开发指南>框架设计部分,给出了整体设计: 以及暴露服务时序图: 本文将根据以上几张图,分析服务暴露的实现原理,并进行详细的代码跟踪与解析. 二.原理和源码解析 2.1 标签解析 从文章<Dubbo原理和源码解析之标签解析>中我们知道,<dubbo:service> 标签会被解析成 ServiceBean. ServiceBean 实现了 Init

EventBus的使用和源码解析

一.基本介绍 EventBus 是一个 Android 事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递,这里的事件可以理解为消息,本文中统一称为事件.事件传递既可用于 Android 四大组件间通讯,也可以用户异步线程和主线程间通讯等等.EventBus EventBus3.0版本有较大的更新,性能上有很大提升.这里主要介绍新版本. 传统的事件传递方式包括:Handler.BroadCastReceiver.Interface 回调,相比之下 EventBus 的优点是

Android 事件总线OTTO使用说明和源码解析

一.Otto简单介绍 OTTO是Square推出的库,地址:https://github.com/square/otto 先来看看otto的官方介绍 An enhanced Guava-based event bus with emphasis on Android support.Otto is an event bus designed to decouple different parts of your application while still allowing them to c

Android依赖注入Dagger的使用和源码解析(上篇)

一.基本概念 依赖注入(DI)和控制反转(IOC): 依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源:而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源. 使用依赖注入可以带来以下好处: 依赖的注入和配置独立于组件之外. 因为对象是在一个独立.不耦合的地方初始化,所以当注入抽象方法的时候,我们只需要修改对象的实现方法,而不用大改代码库. 依赖可以注入到一个组件中:我们可以注入这

django类视图简单使用和源码解析

django的类视图,CBV: 我们在开始接触django的时候,习惯于使用函数编写视图,即FBV.使用FBV时,我们只需要在路由匹配时,对应的路由下找到这个函数就可以了,这样做看似很和谐,但是有的时候,譬如说,当我们需要根据同一个url请求方法的不同而去执行不同的操作时,如果使用FBV去编写视图,那么我们就需要在视图函数中不断地去执行if request.method=='请求方法' 去判断要去执行什么内容,此时的代码就显得不是很优雅.但是此时如果我们使用CBV的方式来编写视图,同样的需求,代

AsyncQueryHandler异步操作数据库的使用和源码解析

一.AsyncQueryHandler的作用: 异步的查询操作帮助类,它可以处理增删改查.当然也可以使用ContentProvider去操作数据库.这在数据量很小的时候是没有问题的,但是如果数据量大了,可能导致UI线程发生ANR事件.当然也可以写个Handler去做这些操作,只是每次使用ContentProvider时都要再写个Handler,必然降低了效率.因此API提供了一个操作数据库的通用方法.它提供:startInsert,startDelete,startUpdate,startQue