作用:
提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。
这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。
列表视图扩展类,提供list(request, *args, **kwargs)
方法快速实现列表视图,返回200状态码。
该Mixin的list方法会对数据进行过滤和分页。
源代码:
| class ListModelMixin(object): |
| """ |
| List a queryset. |
| """ |
| def list(self, request, *args, **kwargs): |
| |
| queryset = self.filter_queryset(self.get_queryset()) |
| |
| page = self.paginate_queryset(queryset) |
| if page is not None: |
| serializer = self.get_serializer(page, many=True) |
| return self.get_paginated_response(serializer.data) |
| |
| serializer = self.get_serializer(queryset, many=True) |
| return Response(serializer.data) |
举例:
| from rest_framework.mixins import ListModelMixin |
| |
| class BookListView(ListModelMixin, GenericAPIView): |
| queryset = BookInfo.objects.all() |
| serializer_class = BookInfoSerializer |
| |
| def get(self, request): |
| return self.list(request) |
创建视图扩展类,提供create(request, *args, **kwargs)
方法快速实现创建资源的视图,成功返回201状态码。
如果序列化器对前端发送的数据验证失败,返回400错误。
源代码:
| class CreateModelMixin(object): |
| """ |
| Create a model instance. |
| """ |
| def create(self, request, *args, **kwargs): |
| |
| serializer = self.get_serializer(data=request.data) |
| |
| serializer.is_valid(raise_exception=True) |
| |
| self.perform_create(serializer) |
| headers = self.get_success_headers(serializer.data) |
| return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) |
| |
| def perform_create(self, serializer): |
| serializer.save() |
| |
| def get_success_headers(self, data): |
| try: |
| return {'Location': str(data[api_settings.URL_FIELD_NAME])} |
| except (TypeError, KeyError): |
| return {} |
详情视图扩展类,提供retrieve(request, *args, **kwargs)
方法,可以快速实现返回一个存在的数据对象。
如果存在,返回200, 否则返回404。
源代码:
| class RetrieveModelMixin(object): |
| """ |
| Retrieve a model instance. |
| """ |
| def retrieve(self, request, *args, **kwargs): |
| |
| instance = self.get_object() |
| |
| serializer = self.get_serializer(instance) |
| return Response(serializer.data) |
举例:
| class BookDetailView(RetrieveModelMixin, GenericAPIView): |
| queryset = BookInfo.objects.all() |
| serializer_class = BookInfoSerializer |
| |
| def get(self, request, pk): |
| return self.retrieve(request) |
更新视图扩展类,提供update(request, *args, **kwargs)
方法,可以快速实现更新一个存在的数据对象。
同时也提供partial_update(request, *args, **kwargs)
方法,可以实现局部更新。
成功返回200,序列化器校验数据失败时,返回400错误。
源代码:
| class UpdateModelMixin(object): |
| """ |
| Update a model instance. |
| """ |
| def update(self, request, *args, **kwargs): |
| partial = kwargs.pop('partial', False) |
| instance = self.get_object() |
| serializer = self.get_serializer(instance, data=request.data, partial=partial) |
| serializer.is_valid(raise_exception=True) |
| self.perform_update(serializer) |
| |
| if getattr(instance, '_prefetched_objects_cache', None): |
| |
| |
| instance._prefetched_objects_cache = {} |
| |
| return Response(serializer.data) |
| |
| def perform_update(self, serializer): |
| serializer.save() |
| |
| def partial_update(self, request, *args, **kwargs): |
| kwargs['partial'] = True |
| return self.update(request, *args, **kwargs) |
删除视图扩展类,提供destroy(request, *args, **kwargs)
方法,可以快速实现删除一个存在的数据对象。
成功返回204,不存在返回404。
源代码:
| class DestroyModelMixin(object): |
| """ |
| Destroy a model instance. |
| """ |
| def destroy(self, request, *args, **kwargs): |
| instance = self.get_object() |
| self.perform_destroy(instance) |
| return Response(status=status.HTTP_204_NO_CONTENT) |
| |
| def perform_destroy(self, instance): |
| instance.delete() |