通用视图说明

View和Mixin

先改动Serialiazers.py

上一节将serializes.py做了详细讲解, 这一节我们将全部使用ModelSerializer进行操作,为了使用方便

class PublishModelSerializers(serializers.ModelSerializer):
    class Meta:
        model=Publish
        fields="__all__"
class BookModelSerializers(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = "__all__"
class AuthorModelSerializers(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = "__all__"

APIView-drf基类

我们之前的类,全部是继承自APIView。APIView是继承自View的子类,做了唯一的事情就是支持restful风格的接口模式,在View的基础上做了一些封装。其他在使用上和传统的View没有任何区别。唯一不同的是这里使用了serializer相关的技能。

class AuthorView(APIView):
    def get(self,request):
        obj = Author.objects.all()
        authors = AuthorSeializer(instance=obj,many=True)
        return Response(data=authors.data)
    def post(self,request):
        a = AuthorSeializer(data=request.data)
        if a.is_valid():
            instance = Author.objects.create(**a.data)
            return Response(AuthorSeializer(instance).data,status=status.HTTP_201_CREATED)
        else:
            return Response(data=a.errors,status=status.HTTP_406_NOT_ACCEPTABLE)

使用GerericAPIView(APIView)-generics基类

使用GenericAPIView,需要提供serializer_class和queryset两个固定字段。

其他的使用方式和传统的APIView没有太多差别

class AuthorView(generics.GenericAPIView):
    queryset = Author.objects.all()
    serializer_class = AuthorSeializer
    def get(self,request,*args,**kwargs):
        obj = Author.objects.all()
        authors = AuthorSeializer(instance=obj,many=True)
        return Response(data=authors.data)
    def post(self,request,*args,**kwargs):
        a = AuthorSeializer(data=request.data)
        if a.is_valid():
            instance = Author.objects.create(**a.data)
            return Response(AuthorSeializer(instance).data,status=status.HTTP_201_CREATED)
        else:
            return Response(data=a.errors,status=status.HTTP_406_NOT_ACCEPTABLE)

用GenericAPIView结合Mixin来进行

class AuthorView(generics.GenericAPIView,mixins.ListModelMixin,mixins.CreateModelMixin):
    queryset = Author.objects.all()
    serializer_class = AuthorSeializer
    def get(self,request,*args,**kwargs):
        return self.list(request,args,kwargs)
    def post(self,request,*args,**kwargs):
        return self.create(request,args,kwargs)

通用类generic

from rest_framework import generics
class AuthorView(generics.ListCreateAPIView):
    queryset=Author.objects.all()
    serializer_class =AuthorModelSerializers

使用ModelViewset:

class AuthorModelView(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSeializer

#-----------urls---------------
url(r'^authors/$', views.AuthorModelView.as_view({"get":"list","post":"create"}),name="author"),
    url(r'^authors/(?P<pk>\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor")

源码分析:

View

Django封装最基础的试图类, 实现as_view方法,方便通过CBV的形式访问接口。

APIView

Djangorestframework中提供的视图类的基类,继承自View,实现了部分rest风格的内容,提供了视图类对rest风格的支持

GenericAPIView

继承自APIView,是所有其他generic类的基类,为其他类混合mixin的开发模式提供基础模板。添加了两个固定字段queryset和serializer_class,提供get_queryset()和get_serializer()方法,方便和其他Mixin结合和使用。

所有generic类如下:

CreateAPIView

  • 提供 post 方法
  • 继承自: GenericAPIView、CreateModelMixin

ListAPIView

  • 提供 get 方法
  • 继承自:GenericAPIView、ListModelMixin

RetireveAPIView

  • 提供 get 方法
  • 继承自: GenericAPIView、RetrieveModelMixin

DestoryAPIView

  • 提供 delete 方法
  • 继承自:GenericAPIView、DestoryModelMixin

UpdateAPIView

  • 提供 put 和 patch 方法
  • 继承自:GenericAPIView、UpdateModelMixin

RetrieveUpdateAPIView

  • 提供 get、put、patch方法
  • 继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin

RetrieveUpdateDestoryAPIView

  • 提供 get、put、patch、delete方法
  • 继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin

Mixin

直接继承自object,每一个Mixin提供一种访问机制,分别是list、retrieve、create、update、destroy。自己实现的类封装,通过多重继承Mixin和GenericAPIView的方式实现多种组合。不同的组合方式可以实现不同的功能,而功能的实现全部由程序自动实现,如果需要在现有基础上做一些扩展,可以直接重写父类的对应函数实现。

所有的Mixin封装如下

class CreateModelMixin(object):

  • 提供Post方法,通过create函数实现

class ListModelMixin(object):

  • 提供get方法,通过list函数实现

class RetrieveModelMixin(object):

  • 提供get方法,通过retrieve函数实现

class UpdateModelMixin(object):

  • 提供put方法,通过Update函数实现

class DestroyModelMixin(object):

  • 提供delete方法,通过destroy函数实现

ViewSet

ViewSetMixin

通过GenericAPIView+ViewSetMixn的形式实现ViewSet。ViewSetMixin直接继承自object,重新实现了as_view方法,使as_view可以使用类似view = MyViewSet.as_view({'get': 'list', 'post': 'create'})的形式来注册方法和处理函数。并且可以使用Router来注册生成接口

GenericViewSet

继承GenericAPIView和ViewSetMixn实现,是所有其他ViewSet类的基类,只提供了一个GenericAPIView类的基本行为,比如get_obejct、get_serializer、get_queryset等。但是没有提供任何的处理的行为,如get、post等。

ModelViewSet

继承自GenericAPIView,和所有的Mixin。(mixins.CreateModelMixin,mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,mixins.ListModelMixin)继承自这个类的实现类会自动提供所有restful风格的增删改查的接口。

ReadOnlyModelViewSet

和上一个类相比,只继承了RetrieveModelMixin,ListModelMixin,两个Mixin,只实现了获取的接口。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值