使用路由模块的原因:在Django url设置中虽然可以正常的开发项目功能,但是如果当项目很大的时候,一个urls.py文件中需要写很多的路由,显得杂乱无序,不够简便,所以需要使用drf中的router来定义。

需要特别注意的是router只能针对视图集来使用,普通的视图不能使用

(一)、DefaultRouter

  • 具体流程:
    • 导入模块:from rest_framework.routers import DefaultRouter
    • 创建路由对象:router = DefaultRouter()
    • 注册视图集:router.register(“路由”,视图集, basename=”名字”)
    • 把路由添加到urlpatterns中:urlpatterns += router.urls
  • 特点:共有三对视图
    • 列表视图
    • 详情视图
    • 项目根路由
  • 提供了json和html两个格式的数据

    注册中不需要写as_view()关系映射了,只写到视图集就可以,需要加上basename,这个是名字

  1. from rest_framework.routers import DefaultRouter
  2. from . import views
  3. urlpatterns = []
  4. router = DefaultRouter()
  5. router.register('extra', views.UserExtraActionViewSet, basename="extra")
  6. urlpatterns += router.urls
  7. ####### print(urlpatterns)
  8. [
  9. <URLPattern '^extra/$' [name='extra-list']>, # 列表视图
  10. <URLPattern '^extra\.(?P<format>[a-z0-9]+)/?$' [name='extra-list']>, # 列表视图
  11. <URLPattern '^extra/(?P<id>[^/.]+)/$' [name='extra-detail']>, # 详情视图
  12. <URLPattern '^extra/(?P<id>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='extra-detail']>, # 详情视图
  13. <URLPattern '^$' [name='api-root']>, # 根路由
  14. <URLPattern '^\.(?P<format>[a-z0-9]+)/?$' [name='api-root']>] # 根路由

(二)、SimpleRouter

  • 具体流程:
    • 导入模块:from rest_framework.routers import SimpleRouter
    • 创建路由对象:router = DefaultRouter()
    • 注册视图集:router.register(“路由”,视图集, basename=”名字”)
    • 把路由添加到urlpatterns中:urlpatterns += router.urls
  • 特点:提供了两个视图
    • 列表视图
    • 详情视图

      注册中不需要写as_view()关系映射了,只写到视图集就可以,需要加上basename,这个是名字

  1. from rest_framework.routers import SimpleRouter
  2. from . import views
  3. urlpatterns = []
  4. router = DefaultRouter()
  5. router.register('extra', views.UserExtraActionViewSet, basename="extra")
  6. urlpatterns += router.urls
  7. ####### print(urlpatterns)
  8. [
  9. <URLPattern '^extra/$' [name='extra-list']>,
  10. <URLPattern '^extra/(?P<id>[^/.]+)/$' [name='extra-detail']>
  11. ]

三、action

  • 在使用SimpleRouter和DefaultRoute的时候,正常情况下路由只是分配了框架中已经封装好的几个行为(方法),自定义的行为(方法)并不能分配路由,不利于定制化开发。所以需要用到rest_framework.decorators中的action装饰器
  • 用法:在自定义的行为上添加,参数两个:
    • methods=[“对应的方法名”],这里的方法是指需要映射的GET、PUT、POST、DELETE等
    • detail=True/False,设定的是是否会传递参数,True表示带有参数,False表示不带参数
  • 路由:添加装饰器后在路由中就生成了自定义行为的路由,需要注意的是,自定义的行为名将作为url的一部分放在路由的最后,如果有id则放在id的后边,之后写上行为名之后才能进入到自定义的行为中 ```python from rest_framework.decorators import action

class UserExtraActionViewSet(ModelViewSet): ‘’’ 视图集额外的动作 ‘’’ queryset = UserProfile.objects.all() serializer_class = UserProfileSerializers lookup_url_kwarg = ‘id’

  1. # 通过创建时间来查询用户信息
  2. @action(methods=["GET"], detail=False) # 装饰器,不带参数
  3. def createTiem(self, request):
  4. starttime = datetime.date(2020, 11, 11)
  5. endtime = datetime.date(2020, 11, 13)
  6. user = UserProfile.objects.filter(
  7. date_joined__range=[starttime, endtime])
  8. serializer = self.get_serializer(instance=user, many=True)
  9. return Response(serializer.data)
  10. # 更新用户名字
  11. @action(methods=["PUT"], detail=True) # 装饰器,带参数
  12. def update_username(self, request, id):
  13. user = self.get_object()
  14. data = request.data
  15. serializer = self.get_serializer(
  16. instance=user, data=data, partial=True)
  17. serializer.is_valid(raise_exception=True)
  18. serializer.save()
  19. return Response(serializer.data, status=status.HTTP_201_CREATED)
#### print(urlspatterns)

[ , , [^/.]+)/$' [name='extra-detail']>, [^/.]+)/update_username/$' [name='extra-update-username']> # 自定义行为的路由 ] ```