Django REST framwork 提供的视图的主要作用:

  • 控制序列化器的执行(检验、保存、转换数据)

  • 控制数据库查询的执行

一:请求与响应

1:request

  1. Request
  2. 1 REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,
    而是REST framework提供的扩展了HttpRequest类的Request类的对象。
  3. 2 REST framework 提供了Parser解析器,在接收到请求后会自动根据Content-Type指明的请求数据类型
    (如JSON、表单等)将请求数据进行parse解析,解析为类字典[QueryDict]对象保存到Request对象中。
  4. 3 Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果
  5. 无论前端发送的哪种格式的数据,我们都可以以统一的方式读取数据。

  常用属性

  1. 1.data
  2. request.data返回解析之后的请求体数据。类似于Django中标准的request.POST request.FILES属性,但提供如下特性:
  3. - 包含了解析之后的文件和非文件数据
  4. - 包含了对POSTPUTPATCH请求方式解析后的数据
  5. - 利用了REST frameworkparsers解析器,不仅支持表单类型数据,也支持JSON数据
  6. 2.query_params
  7. request.query_paramsDjango标准的request.GET相同,只是更换了更正确的名称而已。

2 response 

  rest_framework.response.Response

  1. REST framework提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
  2. REST framework提供了Renderer渲染器,用来根据请求头中的Accept(接收数据类型声明)来自动转换响应数据到对应格式。
    如果前端请求中未进行Accept声明,则会采用默认方式处理响应数据,
  3. 在项目配置文件setting.py中设置响应格式
  4. REST_FRAMEWORK = {
  5. 'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
  6. 'rest_framework.renderers.JSONRenderer', # json渲染器
  7. 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
  8. )
  9. }

  构造方式:   Response(data, status=None, template_name=None, headers=None, content_type=None)

  1. 1 data数据不要是render处理之后的数据,只需传递python的内建类型数据即可,REST framework会使用renderer渲染器处理data
  2. 2 data不能是复杂结构的数据,如Django的模型类对象,对于这样的数据我们可以使用Serializer序列化器序列化处理后(转为了Python字典类型)
    再传递给data参数。参数说明:
  3. - `data`: 为响应准备的序列化处理后的数据;
  4. - `status`: 状态码,默认200
  5. - `template_name`: 模板名称,如果使用`HTMLRenderer` 时需指明;
  6. - `headers`: 用于存放响应头信息的字典;
  7. - `content_type`: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。

  常用属性

  1. 1).data
  2. 传给response对象的序列化后,但尚未render处理的数据
  3. 2).status_code
  4. 状态码的数字
  5. 3).content
  6. 经过render处理后的响应数据

  状态码 : 为了方便设置状态码,REST framewrok在rest_framework.status模块中提供了常用状态码常量。

  1. 1)信息告知 - 1xx
  2. HTTP_100_CONTINUE
  3. HTTP_101_SWITCHING_PROTOCOLS
  4. 2)成功 - 2xx
  5. HTTP_200_OK
  6. HTTP_201_CREATED
  7. HTTP_202_ACCEPTED
  8. HTTP_203_NON_AUTHORITATIVE_INFORMATION
  9. HTTP_204_NO_CONTENT
  10. HTTP_205_RESET_CONTENT
  11. HTTP_206_PARTIAL_CONTENT
  12. HTTP_207_MULTI_STATUS
  13. 3)重定向 - 3xx
  14. HTTP_300_MULTIPLE_CHOICES
  15. HTTP_301_MOVED_PERMANENTLY
  16. HTTP_302_FOUND
  17. HTTP_303_SEE_OTHER
  18. HTTP_304_NOT_MODIFIED
  19. HTTP_305_USE_PROXY
  20. HTTP_306_RESERVED
  21. HTTP_307_TEMPORARY_REDIRECT
  22. 4)客户端错误 - 4xx
  23. HTTP_400_BAD_REQUEST
  24. HTTP_401_UNAUTHORIZED
  25. HTTP_402_PAYMENT_REQUIRED
  26. HTTP_403_FORBIDDEN
  27. HTTP_404_NOT_FOUND
  28. HTTP_405_METHOD_NOT_ALLOWED
  29. HTTP_406_NOT_ACCEPTABLE
  30. HTTP_407_PROXY_AUTHENTICATION_REQUIRED
  31. HTTP_408_REQUEST_TIMEOUT
  32. HTTP_409_CONFLICT
  33. HTTP_410_GONE
  34. HTTP_411_LENGTH_REQUIRED
  35. HTTP_412_PRECONDITION_FAILED
  36. HTTP_413_REQUEST_ENTITY_TOO_LARGE
  37. HTTP_414_REQUEST_URI_TOO_LONG
  38. HTTP_415_UNSUPPORTED_MEDIA_TYPE
  39. HTTP_416_REQUESTED_RANGE_NOT_SATISFIABLE
  40. HTTP_417_EXPECTATION_FAILED
  41. HTTP_422_UNPROCESSABLE_ENTITY
  42. HTTP_423_LOCKED
  43. HTTP_424_FAILED_DEPENDENCY
  44. HTTP_428_PRECONDITION_REQUIRED
  45. HTTP_429_TOO_MANY_REQUESTS
  46. HTTP_431_REQUEST_HEADER_FIELDS_TOO_LARGE
  47. HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS
  48. 5)服务器错误 - 5xx
  49. HTTP_500_INTERNAL_SERVER_ERROR
  50. HTTP_501_NOT_IMPLEMENTED
  51. HTTP_502_BAD_GATEWAY
  52. HTTP_503_SERVICE_UNAVAILABLE
  53. HTTP_504_GATEWAY_TIMEOUT
  54. HTTP_505_HTTP_VERSION_NOT_SUPPORTED
  55. HTTP_507_INSUFFICIENT_STORAGE
  56. HTTP_511_NETWORK_AUTHENTICATION_REQUIRED 

二: 视图

 REST framework 提供了众多的通用视图基类与扩展类,以简化视图的编写。 

1: 两个视图基本类

  1)APIview

  1. rest_framework.views.APIView
  2. APIViewREST framework提供的所有视图的基类,继承自DjangoView父类。
  3. APIViewView的不同之处在于:
  4. 1 传入到视图方法中的是REST frameworkRequest对象,而不是DjangoHttpRequeset对象;
  5. 2 视图方法可以返回REST frameworkResponse对象,视图会为响应数据设置(render)符合前端要求的格式;
  6. 3 任何APIException异常都会被捕获到,并且处理成合适的响应信息;
  7. 4 在进行dispatch()分发前,会对请求进行身份认证、权限检查、流量控制。
  8. 支持定义的属性
  9. 1 authentication_classes 列表或元祖,身份认证类
  10. 2 permissoin_classes 列表或元祖,权限检查类
  11. 3 throttle_classes 列表或元祖,流量控制类
  12. APIView中仍以常规的类视图定义方法来实现get() post() 或者其他请求方式的方法。
  13.  
  14. 举例:
  15. from rest_framework.views import APIView
  16. from rest_framework.response import Response
  17. # url(r'^books/$', views.BookListView.as_view()),
  18. class BookListView(APIView):
  19. def get(self, request):
  20. books = BookInfo.objects.all()
  21. serializer = BookInfoSerializer(books, many=True)
  22. return Response(serializer.data)

  2)GenericAPIView[通用视图类]

  1. 1 描述: 继承自APIVIew主要增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或多个Mixin扩展类。
  2. 提供的关于序列化器使用的属性与方法
  3. 2 属性:
  4. serializer_class 指明视图使用的序列化器
  5. 3 方法
  6. get_serializer_class(self)
  7. 当出现一个视图类中调用多个序列化器时,那么可以通过条件判断在get_serializer_class方法中通过返回不同的序列化器类名就可以让视图方法执行不同的序列化器对象了。
  8. 返回序列化器类,默认返回serializer_class,可以重写,例如:
  9.  
  10. def get_serializer_class(self):
  11. if self.request.user.is_staff:
  12. return FullAccountSerializer
  13. return BasicAccountSerializer
  14.  
  15. 4 get_serializer(self, *args, \**kwargs)
  16. 返回序列化器对象,主要用来提供给Mixin扩展类使用,如果我们在视图中想要获取序列化器对象,也可以直接调用此方法。
  17.  
  18. 注意,该方法在提供序列化器对象的时候,会向序列化器对象的context属性补充三个数据:requestformatview,这三个数据对象可以在定义序列化器时使用。**
  19.  
  20. - **request** 当前视图的请求对象
  21. - **view** 当前请求的类视图对象
  22. - format 当前请求期望返回的数据格式
  23.  
  24. 5 提供的关于数据库查询的属性与方法
  25. 1) 属性:
  26.     queryset 指明使用的数据查询集
  27.  
  28. 2)方法:
  29. 1 get_queryset(self)
  30. 返回视图使用的查询集,主要用来提供给Mixin扩展类使用,是列表视图与详情视图获取数据的基础,默认返回`queryset`属性,可以重写,例如:
  31.  
  32. def get_queryset(self):
  33. user = self.request.user
  34. return user.accounts.all()
  35.  
  36. 2  get_object(self)
  37. 返回详情视图所需的模型类数据对象,主要用来提供给Mixin扩展类使用。
  38. 在试图中可以调用该方法获取详情信息的模型类对象。
  39. 若详情访问的模型类对象不存在,会返回404
  40. 该方法会默认使用APIView提供的check_object_permissions方法检查当前对象是否有权限被访问。
  41. 举例:
  42. # url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),
  43. class BookDetailView(GenericAPIView):
  44. queryset = BookInfo.objects.all()
  45. serializer_class = BookInfoSerializer
  46.  
  47. def get(self, request, pk):
  48. book = self.get_object() # get_object()方法根据pk参数查找queryset中的数据对象
  49. serializer = self.get_serializer(book)
  50. return Response(serializer.data)
  51.  
  52. 其他可以设置的属性
  53. pagination_class 指明分页控制类
  54. filter_backends 指明过滤控制后端

2: 五个扩展类  

  作用:

  1. 1 提供了几种后端视图(对数据资源进行曾删改查)处理流程的实现,如果需要编写的视图属于这五种,则视图可以通过继承相应的扩展类来复用代码,减少自己编写的代码量。
  2. 2 这五个扩展类需要搭配GenericAPIView父类,因为五个扩展类的实现需要调用GenericAPIView提供的序列化器与数据库查询的方法。

  1)ListModelMixin

  1. 列表视图扩展类,提供`list(request, *args, **kwargs)`方法快速实现列表视图,返回200状态码。
  2. Mixinlist方法会对数据进行过滤和分页。
  3.  
  4. #源代码:
  5. class ListModelMixin(object):
  6. """
  7. List a queryset.
  8. """
  9. def list(self, request, *args, **kwargs):
  10. # 过滤
  11. queryset = self.filter_queryset(self.get_queryset())
  12. # 分页
  13. page = self.paginate_queryset(queryset)
  14. if page is not None:
  15. serializer = self.get_serializer(page, many=True)
  16. return self.get_paginated_response(serializer.data)
  17. # 序列化
  18. serializer = self.get_serializer(queryset, many=True)
  19. return Response(serializer.data)
  20. #举例:
  21. from rest_framework.mixins import ListModelMixin
  22. class BookListView(ListModelMixin, GenericAPIView):
  23. queryset = BookInfo.objects.all()
  24. serializer_class = BookInfoSerializer
  25. def get(self, request):
  26. return self.list(request)

  2)CreateModelMixin

  1. 创建视图扩展类,提供`create(request, *args, **kwargs)`方法快速实现创建资源的视图,成功返回201状态码。如果序列化器对前端发送的数据验证失败,返回400错误。
  2. #源代码:
  3. class CreateModelMixin(object):
  4. """
  5. Create a model instance.
  6. """
  7. def create(self, request, *args, **kwargs):
  8. # 获取序列化器
  9. serializer = self.get_serializer(data=request.data)
  10. # 验证
  11. serializer.is_valid(raise_exception=True)
  12. # 保存
  13. self.perform_create(serializer)
  14. headers = self.get_success_headers(serializer.data)
  15. return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  16.  
  17. def perform_create(self, serializer):
  18. serializer.save()
  19.  
  20. def get_success_headers(self, data):
  21. try:
  22. return {'Location': str(data[api_settings.URL_FIELD_NAME])}
  23. except (TypeError, KeyError):
  24. return {}

  3)RetrieveModelMixin

  1. 详情视图扩展类,提供`retrieve(request, *args, **kwargs)`方法,可以快速实现返回一个存在的数据对象。如果存在,返回200 否则返回404
  2.  
  3. #源代码:
  4. class RetrieveModelMixin(object):
  5. """
  6. Retrieve a model instance.
  7. """
  8. def retrieve(self, request, *args, **kwargs):
  9. # 获取对象,会检查对象的权限
  10. instance = self.get_object()
  11. # 序列化
  12. serializer = self.get_serializer(instance)
  13. return Response(serializer.data)
  14.  
  15. #举例:
  16. class BookDetailView(RetrieveModelMixin, GenericAPIView):
  17. queryset = BookInfo.objects.all()
  18. serializer_class = BookInfoSerializer
  19.  
  20. def get(self, request, pk):
  21. return self.retrieve(request)

  4)UpdateModelMixin

  1. 更新视图扩展类,提供`update(request, *args, **kwargs)`方法,可以快速实现更新一个存在的数据对象。同时也提供`partial_update(request, *args, **kwargs)`方法,可以实现局部更新。
  2. 成功返回200,序列化器校验数据失败时,返回400错误。
  3. #源代码:
  4. class UpdateModelMixin(object):
  5. """
  6. Update a model instance.
  7. """
  8. def update(self, request, *args, **kwargs):
  9. partial = kwargs.pop('partial', False)
  10. instance = self.get_object()
  11. serializer = self.get_serializer(instance, data=request.data, partial=partial)
  12. serializer.is_valid(raise_exception=True)
  13. self.perform_update(serializer)
  14.  
  15. if getattr(instance, '_prefetched_objects_cache', None):
  16. # If 'prefetch_related' has been applied to a queryset, we need to
  17. # forcibly invalidate the prefetch cache on the instance.
  18. instance._prefetched_objects_cache = {}
  19.  
  20. return Response(serializer.data)
  21.  
  22. def perform_update(self, serializer):
  23. serializer.save()
  24.  
  25. def partial_update(self, request, *args, **kwargs):
  26. kwargs['partial'] = True
  27. return self.update(request, *args, **kwargs)

  5)DestroyModelMixin

  1. 删除视图扩展类,提供`destroy(request, *args, **kwargs)`方法,可以快速实现删除一个存在的数据对象。
  2. 成功返回204,不存在返回404
  3. 源代码:
  4. class DestroyModelMixin(object):
  5. """
  6. Destroy a model instance.
  7. """
  8. def destroy(self, request, *args, **kwargs):
  9. instance = self.get_object()
  10. self.perform_destroy(instance)
  11. return Response(status=status.HTTP_204_NO_CONTENT)
  12.  
  13. def perform_destroy(self, instance):
  14. instance.delete()

  3: 几个子类视图

  1. 1CreateAPIView
  2. 提供 post 方法
  3. 继承自: GenericAPIViewCreateModelMixin
  4. 2ListAPIView
  5. 提供 get 方法
  6. 继承自:GenericAPIViewListModelMixin
  7. 3RetrieveAPIView
  8. 提供 get 方法
  9. 继承自: GenericAPIViewRetrieveModelMixin
  10. 4DestoryAPIView
  11. 提供 delete 方法
  12. 继承自:GenericAPIViewDestoryModelMixin
  13. 5UpdateAPIView
  14. 提供 put patch 方法
  15. 继承自:GenericAPIViewUpdateModelMixin
  16. 6RetrieveUpdateAPIView
  17. 提供 getputpatch方法
  18. 继承自: GenericAPIViewRetrieveModelMixinUpdateModelMixin
  19. 7RetrieveUpdateDestoryAPIView
  20. 提供 getputpatchdelete方法
  21. 继承自:GenericAPIViewRetrieveModelMixinUpdateModelMixinDestoryModelMixin

  4:视图集ViewSet

  1. 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中:
  2. 1 list() 提供一组数据
  3. 2 retrieve() 提供单个数据
  4. 3 create() 创建数据
  5. 4 update() 保存数据
  6. 5 destory() 删除数据
  7. ViewSet视图集类不再实现get()、post()等方法,而是实现动作 **action** list() create() 等。
  8. 视图集只在使用as_view()方法的时候,才会将**action**动作与具体请求方式对应上。如:
  9. class BookInfoViewSet(viewsets.ViewSet):
  10.  
  11. def list(self, request):
  12. books = BookInfo.objects.all()
  13. serializer = BookInfoSerializer(books, many=True)
  14. return Response(serializer.data)
  15.  
  16. def retrieve(self, request, pk=None):
  17. try:
  18. books = BookInfo.objects.get(id=pk)
  19. except BookInfo.DoesNotExist:
  20. return Response(status=status.HTTP_404_NOT_FOUND)
  21. serializer = BookInfoSerializer(books)
  22. return Response(serializer.data)
  23.  
  24. #在设置路由时,我们可以如下操作
  25.  
  26. urlpatterns = [
  27. url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
  28. url(r'^books/(?P<pk>\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
  29. ]

  5 常用视图集父类

  1. 1 ViewSet
  2. 继承自APIViewViewSetMixin,作用也与APIView基本类似,提供了身份认证、权限校验、流量管理等。ViewSet主要通过继承ViewSetMixin来实现在调用as_view()时传入字典(如{'get':'list'})的映射处理工作。
  3. ViewSet中,没有提供任何动作action方法,需要我们自己实现action方法。
  4. 2GenericViewSet
  5. 使用ViewSet通常并不方便,因为listretrievecreateupdatedestory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与GenericAPIView,所以还需要继承GenericAPIView
  6. GenericViewSet就帮助我们完成了这样的继承工作,继承自GenericAPIView`ViewSetMixin,在实现了调用as_view()时传入字典(如`{'get':'list'}`)的映射处理工作的同时,还提供了GenericAPIView提供的基础方法,可以直接搭配Mixin扩展类使用。
  7.  
  8. ######举例:
  9. from rest_framework import mixins
  10. from rest_framework.viewsets import GenericViewSet
  11. from rest_framework.decorators import action
  12.  
  13. class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
  14. queryset = BookInfo.objects.all()
  15. serializer_class = BookInfoSerializer
  16.  
  17. ######url的定义
  18. urlpatterns = [
  19. url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
  20. url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
  21. ]
  22. 3)ModelViewSet
  23. 继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。
  24. 4)ReadOnlyModelViewSet
  25. 继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin。

  6: 视图集中定义附加动作

  1. 在视图集中,除了上述默认的方法动作外,还可以添加自定义动作。
  2.  
  3. ######举例:
  4. from rest_framework import mixins
  5. from rest_framework.viewsets import GenericViewSet
  6. from rest_framework.decorators import action
  7.  
  8. class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
  9. queryset = BookInfo.objects.all()
  10. serializer_class = BookInfoSerializer
  11.  
  12. def latest(self, request):
  13. """
  14. 返回最新的图书信息
  15. """
  16. book = BookInfo.objects.latest('id')
  17. serializer = self.get_serializer(book)
  18. return Response(serializer.data)
  19.  
  20. def read(self, request, pk):
  21. """
  22. 修改图书的阅读量数据
  23. """
  24. book = self.get_object()
  25. book.bread = request.data.get('read')
  26. book.save()
  27. serializer = self.get_serializer(book)
  28. return Response(serializer.data)
  29. ######url的定义
  30. urlpatterns = [
  31. url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
  32. url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
  33. url(r'^books/(?P<pk>\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
  34. url(r'^books/(?P<pk>\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
  35. ]

  7: action 属性

  1. 在视图集中,我们可以通过action对象属性来获取当前请求视图集时的action动作是哪个。
  2.  
  3. ######例如:
  4. from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
  5. from booktest.models import BookInfo
  6. from .serializers import BookInfoModelSerializer
  7. from rest_framework.response import Response
  8. class BookInfoModelViewSet(ModelViewSet):
  9. queryset = BookInfo.objects.all()
  10. serializer_class = BookInfoModelSerializer
  11.  
  12. def get_top_5(self,request):
  13. """获取评论值最多的5条数据"""
  14. # 操作数据库
  15. print(self.action) # 获取本次请求的视图方法名
  16. ##通过路由访问到当前方法中.可以看到本次的action就是请求的方法名##  

三: 路由Routers

  1. 对于视图集ViewSet,我们除了可以自己手动指明请求方式与动作action之间的对应关系外,还可以使用Routers来帮助我们快速实现路由信息。
  2.  
  3. REST framework提供了两个router
  4.  
  5. - **SimpleRouter**
  6. - **DefaultRouter**
  7.  
  8. ## 2.1 使用方法
  9.  
  10. 1 创建router对象,并注册视图集,例如:
  11. from rest_framework import routers
  12. router = routers.SimpleRouter()
  13. router.register(r'books', BookInfoViewSet, base_name='book')
  14.  
  15. ##register(prefix, viewset, base_name)
  16. - prefix 该视图集的路由前缀
  17. - viewset 视图集
  18. - base_name 路由名称的前缀
  19.  
  20. ######如上述代码会形成的路由如下:
  21. ^books/$ name: book-list
  22. ^books/{pk}/$ name: book-detail
  23.  
  24. 2)添加路由数据
  25. 可以有两种方式:
  26. #方式一
  27. urlpatterns = [
  28. ....
  29. ]
  30. urlpatterns += router.urls
  31. #方式二
  32. urlpatterns = [
  33. ...
  34. url(r'^', include(router.urls))
  35. ]

  2: 视图中附加action的声明

  1. 在视图集中,如果想要让Router自动帮助我们为自定义的动作生成路由信息,需要使用rest_framework.decorators.action装饰器。
  2. action装饰器装饰的方法名会作为action动作名,与listretrieve等同。
  3. action装饰器可以接收两个参数:
  4. - methods: 声明该action对应的请求方式,列表传递
  5. - detail
  6. : 声明该action的路径是否与单一资源对应,及是否是
  7. xxx/<pk>/action方法名/
  8. - True 表示路径格式是`xxx/<pk>/action方法名/`
  9. - False 表示路径格式是`xxx/action方法名/`
  1. from rest_framework import mixins
  2. from rest_framework.viewsets import GenericViewSet
  3. from rest_framework.decorators import action
  4.  
  5. class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
  6. queryset = BookInfo.objects.all()
  7. serializer_class = BookInfoSerializer
  8.  
  9. # detail为False 表示路径名格式应该为 books/latest/
  10. @action(methods=['get'], detail=False)
  11. def latest(self, request):
  12. """
  13. 返回最新的图书信息
  14. """
  15. ...
  16.  
  17. # detail为True,表示路径名格式应该为 books/{pk}/read/
  18. @action(methods=['put'], detail=True)
  19. def read(self, request, pk):
  20. """
  21. 修改图书的阅读量数据
  22. """

  由路由器自动为此视图集自定义action方法形成的路由会是如下内容:

  1. ^books/latest/$ name: book-latest
  2. ^books/{pk}/read/$ name: book-read

  3路由router形成URL的方式

1) SimpleRouter

2)DefaultRouter

DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。

重点:视图类流程关系图

  

二: drf视图的更多相关文章

  1. (二) DRF 视图

    DRF中的Request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别于Dj ...

  2. DRF 视图组件

    目录 DRF 视图组件 视图组件大纲 两个视图基本类 五个扩展类 九个子类视图 视图集 常用视图集父类 魔法类 一览表 DRF中视图的"七十二变" 第一层:基于APIview的五个 ...

  3. 使用DRF视图集时自定义action方法

    在我们用DRF视图集完成了查找全部部门,创建一个新的部门,查找一个部门,修改一个部门,删除一个部门的功能后,views.py的代码是这样子的: class DepartmentViewSet(Mode ...

  4. 【DRF视图】

    目录 开始使用内置视图 请结合[DRF序列化]此文献中的数据文件及序列化文件来阅读如下代码. DRF视图为我们提供了非常简便的方法--内置了增删改查等一系列的操作. 我们只需在url中指定对应的方法, ...

  5. arcgis api 4.x for js 自定义 Draw 绘制手绘面以及手绘线,只针对二维视图(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

  6. C#开发BIMFACE系列28 服务端API之获取模型数据13:获取三维视点或二维视图列表

    系列目录     [已更新最新开发文章,点击查看详细] 本篇主要介绍如何获取一个模型中包含的三维视点或二维视图列表. 请求地址:GET https://api.bimface.com/data/v2/ ...

  7. DRF视图-请求与响应

    DRF视图 drf的代码简写除了在数据序列化体现以外,在视图中也是可以的.它在django原有的django.views.View类基础上,drf内部封装了许多子类以便我们使用. Django RES ...

  8. DRF视图组件

    DRF视图组件: CVB模式继承----五层 from django.views import View # Django的View from rest_framework.views import ...

  9. drf 视图使用及源码分析

    前言 drf视图的源码非常的绕,但是实现的功能却非常的神奇. 它能够帮你快速的解决ORM增删改查的重复代码,非常的方便好用. 下面是它源码中的一句话: class ViewSetMixin: &quo ...

随机推荐

  1. 磁盘异步I / O在Windows上显示为同步

    概要 Microsoft Windows上的文件I / O可以是同步或异步的.I / O的默认行为是同步的,其中调用I / O函数并在I / O完成时返回.异步I / O允许I / O函数立即将执行返 ...

  2. HTTP状态码简单总结

    状态码数字的第一位表明了响应类别,如以下5种:     类别 原因短语 1XX Informational(信息性状态码) 接受的请求正在处理 2XX Success(成功状态码) 请求正常处理完毕 ...

  3. filter过滤器实现验证跳转_返回验证结果

    1. 需求背景 需要对某个请求url进行拦截,模拟是否可以进入某一个接口,如果拦截需要返回数据false,别问我为何不用intercept拦截器. 2. web.xml <filter> ...

  4. java之动态代理

    摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 这里说的静态代理可以理解为之前使用的装饰者模式,从之前使用装饰者模式实 ...

  5. vs添加github代码库

    1.安装git for windows 2.在vs中工具->扩展和更新,安装github extension 3.在项目中右键,添加源码到git,之后配置git,然后选择同步或者commit即可

  6. 一、iOS开发环境搭建

    前置条件 1. 必要:一台装有Mac OS X操作系统的电脑:经济允许的话可以买一部Mac book:否则的话,可以试试黑苹果或虚拟机. 2.必要:一个有可用的Apple ID:免费,在Apple的官 ...

  7. [LeetCode] 33. Search in Rotated Sorted Array_Medium tag: Binary Search

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  8. pycharm的简介

    pycharm使用 集成开发环境(IDE,Integrated Development Environment ) VIM #经典的linux下的文本编辑器 Emacs #linux 文本编辑器, 比 ...

  9. Mybatis(二)总结

    1. 输入映射(就是映射文件中可以传入哪些参数类型) 1)基本类型 2)pojo类型 3)Vo类型2. 输出映射(返回的结果集可以有哪些类型) 1)基本类型 2)pojo类型 3)List类型3. 动 ...

  10. java8模拟grouby方法

    public class ListUtils{ /** * list 集合分组 * * @param list 待分组集合 * @param groupBy 分组Key算法 * @param < ...