我可以在同一个应用程序中使用不同的根 URL 吗?
Can I have different root URLs in the same app?
在我的 DRF 项目中,我有 2 个应用程序,Users
和 Products
。 Products
有 2 个模型:Category
和 Product
。我的根 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
里面,Category
和Product
各一个。
#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))
]
在我的 DRF 项目中,我有 2 个应用程序,Users
和 Products
。 Products
有 2 个模型:Category
和 Product
。我的根 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
里面,Category
和Product
各一个。
#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))
]