1、自动生成路由
from rest_framework import routers
# 1、创建路由对象
# a.DefaultRouter与SimpleRouter功能类似,不过会自动添加一个根路由(作为获取当前数据的入口)
router = routers.SimpleRouter()
# router = routers.DefaultRouter()
# 2、注册路由
# a.第一个参数为路由前缀
# b.第二个参数为视图集
# c.使用视图集中的路由机制,只会为特定的action自动生成路由条件
# 特定的action:retrieve、update、list、create等
router.register(r'projects', views.ProjectViewSet)
urlpatterns = [ ]
# 3、合并路径条目 urlpatterns += router.urls
自定义的action,不会自动生成路由条目
1、可以手动在urlpatterns添加路由映射
2、添加action装饰器(见下方2)
2、自定义action
from rest_framework.decorators import action
a.如果需要使用视图集中的路由机制来为自定义的action,自动生成路由条目,那么需要使用action
b.methods参数默认为get方法,可以在列表中指定多个请求方法
c.detail指定是否需要接收模型主键值,如果无需接收主键值,那么需要设置detail=False,否则需要设置detail=True
d.url_path指定生成的路由条目路径名,默认为自定义action方法名称
e.url_name指定生成的路由名称后缀,默认为自定义action方法名称
@action(methods=['get'], detail=False, url_path='pp', url_name='nn')
@action(methods=['get'], detail=False) def names(self, request): queryset = self.get_queryset() names_list = [{'id': project.id, 'name': project.name} for project in queryset] return Response(names_list, status=status.HTTP_200_OK) @action(detail=True) def interfaces(self, request, *args, **kwargs): project = self.get_object() interface_qs = project.interfaces.all() interfaces_list = [{'id': interface.id, 'name': interface.name} for interface in interface_qs] return Response(interfaces_list, status=status.HTTP_200_OK)