Friday, 15 May 2015

django - Ordering items on the root api view for DefaultRouter -



django - Ordering items on the root api view for DefaultRouter -

i'm using defaultrouter provided drf because need root api view. however, items on view aren't in logical order. looked source , discovered each entry set dictionary (which inherently isn't ordered).

class defaultrouter(simplerouter): """ default router extends simplerouter, adds in default api root view, , adds format suffix patterns urls. """ include_root_view = true include_format_suffixes = true root_view_name = 'api-root' def get_api_root_view(self): """ homecoming view utilize api root. """ api_root_dict = {} list_name = self.routes[0].name 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, format=none): ret = {} key, url_name in api_root_dict.items(): ret[key] = reverse(url_name, request=request, format=format) homecoming response(ret) homecoming apiroot.as_view()

i'd order items on root api view alphabetically , modifying source. wondering, have of come solutions order root api items without modifying source code?

along lines of suggest , of first point in denis cornehi's answer, here extension of defaultrouter orders urls base_names:

# myapp/routers.py rest_framework import routers rest_framework import views rest_framework.response import response rest_framework.reverse import reverse import operator import collections class ordereddefaultrouter(routers.defaultrouter): def get_api_root_view(self): """ homecoming view utilize api root ordered links. """ api_root_dict = {} list_name = self.routes[0].name 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, format=none): ret = {} key, url_name in api_root_dict.items(): ret[key] = reverse(url_name, request=request, format=format) sorted_ret = collections.ordereddict(sorted(ret.items(), key=operator.itemgetter(0))) homecoming response(sorted_ret) homecoming apiroot.as_view()

django django-rest-framework

No comments:

Post a Comment