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,只实现了获取的接口。