[Solved]-Include list_route methods in Django REST framework's API root

2๐Ÿ‘

โœ…

You could try to inherit from DefaultRouter which is responsible for api root view and redefine get_api_root_view method.

class MyRouter(routers.DefaultRouter):
    def get_api_root_view(self):
        """
        Return a view to use as the API root.
        """
        api_root_dict = OrderedDict()
        list_name = self.routes[0].name
        for prefix, viewset, basename in self.registry:
            api_root_dict[prefix] = list_name.format(basename=basename)

        class APIRoot(views.APIView):
            _ignore_model_permissions = True

            def get(self, request, *args, **kwargs):
                ret = OrderedDict()
                namespace = request.resolver_match.namespace
                for key, url_name in api_root_dict.items():
                    if namespace:
                        url_name = namespace + ':' + url_name
                    try:
                        ret[key] = reverse(
                            url_name,
                            args=args,
                            kwargs=kwargs,
                            request=request,
                            format=kwargs.get('format', None)
                        )
                    except NoReverseMatch:
                        # Don't bail out if eg. no list routes exist, only detail routes.
                        continue

                ret['book-featured-list'] = '%s%s' % (ret['books'], 'featured/')

                return Response(ret)

        return APIRoot.as_view()

P.S. sorry, didnโ€™t see your comment before I posted the answer

๐Ÿ‘คlikeon

2๐Ÿ‘

You can install package django-rest-swagger, just follow here: https://github.com/marcgibbons/django-rest-swagger

It is more powerful than DRFโ€™s api list page. It will list all the rest apis (include list_route/detail_route apis) for your modules, and you can also do some api test (CRUD) on the page.

๐Ÿ‘คgzerone

0๐Ÿ‘

I use this solution based on likeonโ€™s answer:

class MyRouter(routers.DefaultRouter):
    def get_api_root_view(self, api_urls=None):
        api_root_dict = OrderedDict()
        list_name = self.routes[0].name
        for prefix, viewset, basename in self.registry:
            api_root_dict[prefix] = list_name.format(basename=basename)

        api_root_dict['books/featured'] = 'book-featured'

        return self.APIRootView.as_view(api_root_dict=api_root_dict)
๐Ÿ‘คViktar K

-1๐Ÿ‘

Can you try with, put this below your urlpatterns.
Your url will be like this:

http://localhost:8000/api/books/

from rest_framework.urlpatterns import format_suffix_patterns

urlpatterns = format_suffix_patterns(urlpatterns)
๐Ÿ‘คMarin

Leave a comment