码迷,mamicode.com
首页 > 其他好文 > 详细

rest-framework之视图和源码解析

时间:2018-08-07 21:26:11      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:orm   一个   简化   let   model   eve   self   res   EAP   

视图和源码解析

通过使用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 里的

技术分享图片

 

rest-framework之视图和源码解析

标签:orm   一个   简化   let   model   eve   self   res   EAP   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!