我可以在同一个应用程序中使用不同的根 URL 吗?

Can I have different root URLs in the same app?

在我的 DRF 项目中,我有 2 个应用程序,UsersProductsProducts 有 2 个模型:CategoryProduct。我的根 URL conf 看起来像这样

api_urls = [
    path('users/', include('users.urls')),
    path('products/', include('products.urls'))
]

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(api_urls))
]

和products.urls

urlpatterns = [
  path('', views.ProductListCreateAPIView.as_view())
]

我希望我的 API 方案类似于

/api/users/
/api/products/
/api/categories/

现在,前两个 URLS 工作正常,但显然不是第三个,即如果我要添加

path('categories', views.CategoriesListCreateAPIView.as_view())

我的 products.urls,URL 方案是

/api/products/categories/

我的问题是,有没有什么办法可以实现 /api/categories/ objective 而无需将 Category 拆分到自己的应用程序中?我觉得它太微不足道了,不能保证拥有自己的应用程序,应该与 Product 在同一个应用程序中。显然,我想我可以直接在根 URL conf 中导入视图,但这不像 'clean' 解决方案。我应该考虑为类别创建一个单独的应用程序吗? Product 模型与 Category 有外键关系,对我来说,感觉好像 2 个单独的 App 只会让事情复杂化。

首先你需要认识到你有一些相互矛盾的需求;你想做一些不寻常的事情(同一个应用程序中的两个单独的根路径)但你也想保留它 "clean".

我能想到的最干净的解决方案是在包含应用程序 urlconf 时根本不使用前缀,而是像设置 api 前缀一样在文件中设置它。所以:

path('', include('products.urls'))

然后

product_patterns = [
  path('', views.ProductListCreateAPIView.as_view()),
  ...
]

urlpatterns = [
    path('categories', views.CategoriesListCreateAPIView.as_view()),
    path('products/', include(product_patterns)
]

我最终选择了以下方法:我没有在我的 Products 应用程序中使用单个 urls.py,而是在应用程序中创建了一个 URL 模块并添加了两个 urlconfs里面,CategoryProduct各一个。

#product/urls/producturls.py

urlpatterns = [
  path('', views.ProductListCreateAPIView.as_view())
]

#product/urls/categoryurls.py

urlpatterns = [
  path('', views.CategoryListCreateAPIView.as_view())
]

然后我 include() 都在我的根 urlconf

api_urls = [
    path('users/', include('users.urls')),
    path('products/', include('products.urls.producturls')),
    path('categories/', include('products.urls.categoryurls'))
]

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include(api_urls))
]