使用路由模块的原因:在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,这个是名字
from rest_framework.routers import DefaultRouterfrom . import viewsurlpatterns = []router = DefaultRouter()router.register('extra', views.UserExtraActionViewSet, basename="extra")urlpatterns += router.urls####### print(urlpatterns)[<URLPattern '^extra/$' [name='extra-list']>, # 列表视图<URLPattern '^extra\.(?P<format>[a-z0-9]+)/?$' [name='extra-list']>, # 列表视图<URLPattern '^extra/(?P<id>[^/.]+)/$' [name='extra-detail']>, # 详情视图<URLPattern '^extra/(?P<id>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='extra-detail']>, # 详情视图<URLPattern '^$' [name='api-root']>, # 根路由<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,这个是名字
from rest_framework.routers import SimpleRouterfrom . import viewsurlpatterns = []router = DefaultRouter()router.register('extra', views.UserExtraActionViewSet, basename="extra")urlpatterns += router.urls####### print(urlpatterns)[<URLPattern '^extra/$' [name='extra-list']>,<URLPattern '^extra/(?P<id>[^/.]+)/$' [name='extra-detail']>]
三、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’
# 通过创建时间来查询用户信息@action(methods=["GET"], detail=False) # 装饰器,不带参数def createTiem(self, request):starttime = datetime.date(2020, 11, 11)endtime = datetime.date(2020, 11, 13)user = UserProfile.objects.filter(date_joined__range=[starttime, endtime])serializer = self.get_serializer(instance=user, many=True)return Response(serializer.data)# 更新用户名字@action(methods=["PUT"], detail=True) # 装饰器,带参数def update_username(self, request, id):user = self.get_object()data = request.dataserializer = self.get_serializer(instance=user, data=data, partial=True)serializer.is_valid(raise_exception=True)serializer.save()return Response(serializer.data, status=status.HTTP_201_CREATED)
#### print(urlspatterns)
[
