Могу ли я иметь разные корневые URL в одном приложении? - PullRequest
0 голосов
/ 26 апреля 2018

В моем проекте DRF у меня есть 2 приложения, Users и Products.Products имеет 2 модели: Category и Product.Мой корневой URL-адрес выглядит так:

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/

Прямо сейчасэто хорошо работает для первых двух URL, но, очевидно, не для третьего, т. е. если бы я добавил

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

в мои products.urls, схема URL была бы

/api/products/categories/

Мой вопрос: есть ли способ достичь цели /api/categories/ без разделения Category на собственное приложение?Я чувствую, как будто это слишком незначительно, чтобы гарантировать наличие собственного приложения и должно быть в том же приложении, что и Product.Очевидно, я мог бы просто импортировать представления непосредственно в корневой URL-адрес conf, но это не похоже на «чистое» решение.Должен ли я подумать о создании отдельного приложения для категории?Модель продукта имеет отношение внешнего ключа к категории, и мне кажется, что 2 отдельных приложения просто усложняют ситуацию.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

В итоге я выбрал следующий подход: вместо использования одного urls.py в моем приложении Products я создал модуль 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))
]

Screenshot

0 голосов
/ 26 апреля 2018

Прежде всего вы должны признать, что у вас есть некоторые противоречивые требования; вы хотите сделать что-то необычное (два отдельных корневых пути в одном приложении), но вы также хотите сохранить его «чистым».

Самое чистое решение, которое я могу придумать, - это вообще не использовать префикс при включении приложения 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)
]
...