'Howto combine DjangoRestFramework routers for different apps

I use Django 2.1 and DRF and a planning a quite larger application with many plugged-in apps. I'd like to have ONE /api URL for the DRF as endpoint, but allow each app to have a special model exposed over the REST endpoint, e.g.:

In the main urls.py:

router = routers.DefaultRouter()
router.register(r'users', UserViewSet)

urlpatterns = [
    # ...
    path('api/', include(router.urls)),
    # ...
]

and in foo_app/urls.py:

router = routers.DefaultRouter()
router.register(r'foomodel', FooModelViewSet)

Now, /api/foomodel produces a 404 Error. The foo_model/urls.py gets imported (a print statement there is printed at Django start), and all the other foo_model.urlpattern[path...] are recognized and work fine.

How can I define custom api model endpoints for a central api REST endpoint? I didn't find anything in the documentation.

Thanks in advance.



Solution 1:[1]

I simply achieved this by extending the router registries.

root urls.py

from ad.urls import router as ad_router

main_router = routers.DefaultRouter()
main_router.registry.extend(ad_router.registry)

ad.urls.py

from .api.urls import router as api_router

router = routers.DefaultRouter()
router.registry.extend(api_router.registry)

ad.api.urls.py

router = routers.DefaultRouter()
router.register(r'ad', AdViewSet)

Solution 2:[2]

In your main urls.py you would do something like this. (This is for Django 1.8)

urlpatterns += patterns('',
url(r'^api/', include(patterns('',
    url(r'^foo_app/', include('foo_app.urls')),
    url(r'^bar_app/', include('bar_app.urls')),
    url(r'^test_app/', include('test_app.urls')),
))))

this allows you to access all your endpoints this way

localhost:8000/api/foo_app/<foo_app_endpoint>
localhost:8000/api/bar_app/<bar_app_endpoint>
localhost:8000/api/bar_app/<test_app_endpoint>

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 rob.t.ux
Solution 2 Andrea Olivato