Django REST API - можно ли создать один routers.py для приложения? - PullRequest
1 голос
/ 01 марта 2020

Здравствуйте, я настроил Django проект, который включает в себя REST API, до сих пор это структура проекта:

django
│
├───apps
│   ├───store
│   |       admin.py
│   |       apps.py
│   |       models.py
│   |       serializers.py
│   |       tests.py
│   |       urls.py
│   |       views.py
│   |       viewsets.py
│   |       __init__.py
│   ├───accounts 
│           admin.py
│           apps.py
│           models.py
│           serializers.py
│           tests.py
│           urls.py
│           views.py
│           viewsets.py
│           __init__.py
├───main
        asgi.py
        router.py
        settings.py
        urls.py
        wsgi.py
        __init__.py

Внутри main / urls.py У меня есть что-то вроде этого (который настройка конечной точки URL-адреса API с помощью файла routers.py):

from django.contrib import admin
from django.urls import path, include
from .router import router

urlpatterns = [
    # Default urls
    path('admin/', admin.site.urls),
    path('api/', include(router.urls)),
    path('', include('apps.store.urls')),
]

Внутри main / routers.py Я регистрирую все свои наборы представлений для всего проекта:

from rest_framework.routers import DefaultRouter
from apps.store.viewsets import ItemViewSet, PurchaseViewSet, ReceiptViewSet
from apps.accounts.viewsets import ProfileViewSet, TransactionViewSet

router = DefaultRouter()
router.register('items', ItemViewSet)
router.register('purchases', PurchaseViewSet)
router.register('receipts', ReceiptViewSet)
router.register('profiles', ProfileViewSet)
router.register('transactions', TransactionViewSet)

Все работает хорошо, но моя проблема в том, что в этом routers.py мне нужно будет зарегистрировать все ViewSets для всего проекта, я думаю, это не поможет с модульностью и может сделать этот файл большим и запутанным.

ВОПРОС: Можно ли создать один routers.py для приложения, а затем каким-либо образом импортировать и объединить их в main / routers.py или есть какой-либо другой способ регистрации наборов представлений для каждого приложения внутри каждое соответствующее приложение? Или есть какой-то другой рекомендуемый метод?

Надеюсь, вопрос ясен, большое спасибо!

Ответы [ 2 ]

0 голосов
/ 01 марта 2020

Я только что узнал, что лучший способ - это импортировать маршрутизатор из приложения и использовать метод router.registry.extend.

Сначала в файле routers.py я назову маршрутизатор чем-то уникальным, чтобы избежать коллизии имен при объединении их

router_store = DefaultRouter()
router_store.register('items', ItemViewSet)
router_store.register('purchases', PurchaseViewSet)
router_store.register('receipts', ReceiptViewSet)

Затем в основном routers.py я импортирую все мои маршрутизаторы, затем создаю новый маршрутизатор и расширяю его, используя их routers.py:

from store.routers import router_store
from accounts.routers import router_accounts

router = DefaultRouter()
router.registry.extend(router_store.registry)
router.registry.extend(router_accounts.registry)
0 голосов
/ 01 марта 2020

Мое решение может быть сложным, и я раньше не работал ни с Django, ни с REST api. Однако я думал о том, как использовать Pathlib, и он просматривает все приложения, находя местоположение ViewSet. Затем с помощью регулярных выражений находит имена ViewSets и записывает их в файл со списком всех вещей. Затем файл routers.py читает файл и просматривает каждый ViewSet в файле.

...