Django-11-自动生成routers路由、自定义action

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)

 

原文地址:https://www.cnblogs.com/erchun/p/14490943.html