DjangoRESTframework(七)-五个扩展类的使用(Create、ListModel,Retrieve,Update,Destroy)
一、CreateAPIView
rest_framework.generics.CreateAPIView
作用:创建一个新的模型对象
继承自: GenericAPIView、CreateModelMixin
在CreateModelMixin的原有基础上提供了post方法,内部调用了CreateModelMixin的create方法,使得代码更加精简
1、源代码
class CreateAPIView(mixins.CreateModelMixin,
GenericAPIView):
"""
Concrete view for creating a model instance.
"""
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
2、对比使用
继承 GenericAPIView、CreateModelMixin
class CreateApiView(GenericAPIView, CreateModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def post(self, request):
return self.create(request)
继承CreateAPIView
class _CreateApiView(CreateAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
二、ListAPIView
rest_framework.generics.ListAPIView
作用:获取所有模型对象的数据
继承自:GenericAPIView、ListModelMixin
在ListModelMixin的继承上提供了get方法,内部调用了ListModelMixin的list方法
1、源代码
class ListAPIView(mixins.ListModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
2、对比使用
继承GenericAPIView、ListModelMixin
class ListApiView(GenericAPIView, ListModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def get(self, request):
return self.list(request)
继承ListAPIView
class _ListApiView(ListApiView):
serializer_class = BookSerializer
queryset = BookInfo.objects
三、RetrieveAPIView
rest_framework.generics.RetrieveAPIView
作用:获取单一模型对象数据
继承自: GenericAPIView、RetrieveModelMixin
在RetrieveModelMixin的基础上提供了get方法,内部调用了RetrieveModelMixin的retrieve方法
1、源代码
class RetrieveAPIView(mixins.RetrieveModelMixin,
GenericAPIView):
"""
Concrete view for retrieving a model instance.
"""
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
2、对比使用
继承GenericAPIView、RetrieveModelMixin
class RetrieveApiView(GenericAPIView, RetrieveModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def get(self, request, pk):
return self.retrieve(request)
继承RetrieveAPIView
class _RetrieveApiView(RetrieveAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
四、DestoryAPIView
rest_framework.generics.DestoryAPIView
作用:删除单一模型对象数据
继承自:GenericAPIView、DestoryModelMixin
在DestoryModelMixin的基础上提供了delete方法,内部调用了DestoryModelMixin的destory方法
1、源代码
class DestroyAPIView(mixins.DestroyModelMixin,
GenericAPIView):
"""
Concrete view for deleting a model instance.
"""
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
2、对比使用
继承GenericAPIView、DestoryModelMixin
class DestroyApiView(GenericAPIView, DestroyModelMixin):
queryset = BookInfo.objects
def delete(self, request, pk):
return self.destroy(request)
继承DestoryAPIView
class _DestroyApiView(DestroyAPIView):
queryset = BookInfo.objects
五、UpdateAPIView
rest_framework.generics.UpdateAPIView
作用:更新单一模型对象数据
继承自:GenericAPIView、UpdateModelMixin
在UpdateModelMixin的基础上提供了put和patch方法,内部调用了update和partial_update方法
1、源代码
class UpdateAPIView(mixins.UpdateModelMixin,
GenericAPIView):
"""
Concrete view for updating a model instance.
"""
def put(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
2、对比使用
继承GenericAPIView、UpdateModelMixin
class UpdateApiView(GenericAPIView, UpdateModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def put(self, request, pk):
return self.update(request)
继承UpdateAPIView
class _UpdateApiView(UpdateAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
六、ListCreateAPIView
rest_framework.generics.ListCreateAPIView
作用:查询所有模型对象数据、创建模型对象数据
继承自:GenericAPIView、ListModelMixin、CreateModelMixin
结合ListModelMixin、CreateModelMixin并在其基础上提供了get和post方法,内部调用了ListModelMixin的list方法、CreateModelMixin的create方法
1、源代码
class ListCreateAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
GenericAPIView):
"""
Concrete view for listing a queryset or creating a model instance.
"""
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
2、对比使用
继承GenericAPIView、ListModelMixin、CreateModelMixin
class BooksMixinsView(GenericAPIView, ListModelMixin, CreateModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def get(self, request):
"""获取所有模型对象数据"""
return self.list(request)
def post(self, request):
"""创建模型对象数据"""
return self.create(request)
继承ListCreateAPIView
class _ListCreateApiView(ListCreateAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
七、RetrieveUpdateAPIView
rest_framework.generics.RetrieveUpdateAPIView
作用:获取单一模型对象数据、更改单一模型对象数据
继承自: GenericAPIView、RetrieveModelMixin、UpdateModelMixin
结合RetrieveModelMixin、UpdateModelMixin在其基础上提供 get、put(整体更新)、patch(局部更新)方法
1、源代码
class RetrieveUpdateAPIView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
GenericAPIView):
"""
Concrete view for retrieving, updating a model instance.
"""
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 patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
2、使用
class _RetrieveUpdateAPIView(RetrieveUpdateAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
八、RetrieveDestoryAPIView
rest_framework.generics.RetrieveDestoryAPIView
作用:获取单一模型对象数据、删除单一模型对象数据
继承自:GenericAPIView、RetrieveModelMixin、DestoryModelMixin
在RetrieveModelMixin、DestoryModelMixin的基础上提供提供 get、delete方法
1、源代码
class RetrieveDestroyAPIView(mixins.RetrieveModelMixin,
mixins.DestroyModelMixin,
GenericAPIView):
"""
Concrete view for retrieving or deleting a model instance.
"""
def get(self, request, *args, **kwargs):
return self.retrieve(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
2、使用
class _RetrieveDestroyAPIView(RetrieveDestroyAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
九、RetrieveUpdateDestoryAPIView
rest_framework.generics.RetrieveUpdateDestoryAPIView
作用:提供单一模型对象的查询、更新、删除
提供 get、put、patch、delete方法
继承自:GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
1、源代码
class RetrieveUpdateDestroyAPIView(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
GenericAPIView):
"""
Concrete view for retrieving, updating or deleting a model instance.
"""
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 patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
2、对比使用
继承GenericAPIView、RetrieveModelMixin、UpdateModelMixin、DestoryModelMixin
class BookMixinsView(GenericAPIView, DestroyModelMixin, RetrieveModelMixin, UpdateModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def get(self, request, pk):
"""获取单一模型对象数据"""
return self.retrieve(request, pk=pk)
def delete(self, request, pk):
"""删除单一模型对象数据"""
return self.destroy(request, pk=pk)
def put(self, request, pk):
"""修改单一模型对象数据"""
return self.update(request, pk=pk)
继承RetrieveUpdateDestoryAPIView
class _RetrieveUpdateDestoryAPIView(RetrieveUpdateDestroyAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
十、总结
对于上述的视图类,在使用时大多数使用RetrieveUpdateDestoryAPIView、ListCreateAPIView就基本上能满足对模型对象的增删改查
# 视图
class _ListCreateApiView(ListCreateAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
class _RetrieveUpdateDestoryAPIView(RetrieveUpdateDestroyAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
# 路由
path('demo/books/', _ListCreateApiView.as_view()),
re_path(r'^demo/books/(?P<pk>\d+)/$', _RetrieveUpdateDestoryAPIView.as_view()),
九个视图子类与五个扩展类的区别:
1、九个视图子类继承至五个扩展类
2、都依赖于GenericAPIView
3、九个视图子类在使用时,只需提供序列化器和查询集对象
4、更精简于五个扩展类、在下面可以看出,这就是封装的好处,提高了编写代码的效率,也精简了代码。
class BooksMixinsView(GenericAPIView, ListModelMixin, CreateModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def get(self, request):
"""获取所有模型对象数据"""
return self.list(request)
def post(self, request):
"""创建模型对象数据"""
return self.create(request)
class BookMixinsView(GenericAPIView, DestroyModelMixin, RetrieveModelMixin, UpdateModelMixin):
serializer_class = BookSerializer
queryset = BookInfo.objects
def get(self, request, pk):
"""获取单一模型对象数据"""
return self.retrieve(request, pk=pk)
def delete(self, request, pk):
"""删除单一模型对象数据"""
return self.destroy(request, pk=pk)
def put(self, request, pk):
"""修改单一模型对象数据"""
return self.update(request, pk=pk)
class _ListCreateApiView(ListCreateAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects
class _RetrieveUpdateDestoryAPIView(RetrieveUpdateDestroyAPIView):
serializer_class = BookSerializer
queryset = BookInfo.objects