在 Django REST Framework 中,有两种不同的 URL 注册机制:
- 使用 rest_framework.routers:
router.register(r'capacity_health', viewsets.HealthSummaryViewSet)
urlpatterns = [url(r'^', include(router.urls))]
在这里,router 是一个 Django REST Framework 的路由器对象,通常是一个 SimpleRouter 或 DefaultRouter 的实例。通过调用 router.register() 方法,您可以将视图集(ViewSet)与一个 URL 前缀关联起来。在上面的例子中,HealthSummaryViewSet 与 'capacity_health' 关联,意味着所有与健康概览相关的 CRUD 操作(如 list、create、retrieve、update、destroy 等)都将自动映射到以 'capacity_health' 开头的一系列 URL 上。
例如,如果使用默认的命名规则,HealthSummaryViewSet 的 list 操作会被映射到 /capacity_health/,而 detail 操作则会被映射到类似于 /capacity_health/<pk>/ 的 URL。
- 手动定义 URL:
Python
url(r'^resource_pool/$', viewsets.fetch_resource_pool_list),
# url(r'^resource_pool_meta/$', viewsets.fetch_resource_pool_permissions),
url(r'^forecast_job_callback/$', viewsets.forecast_job_callback),
url(r'^normal_product/token/$', viewsets.get_token),
url(r'^normal_product/bulk_insert/$', viewsets.normal_product_bulk_insert)
)
在这部分代码中,每个 URL 都是手动通过 url() 函数明确指定的,并且直接指向视图集中的具体方法。这种方式更显式,对于一些特殊的操作或者非标准的资源处理非常有用,比如回调函数、获取令牌的操作或批量插入数据的方法。
总结一下,两者的主要区别在于:
- 自动路由器(router.urls)简化了常见的 CRUD 操作的 URL 映射,并且支持分页、过滤等功能的 URL 参数。
- 手动定义 URL 允许更多定制和灵活性,特别适用于视图集中非标准视图函数的路由绑定,或者是单个动作(action)的绑定。