Skip to content

Commit 387250b

Browse files
Automagically determine base_name in router class
1 parent e4067bf commit 387250b

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

rest_framework/routers.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,22 @@ class BaseRouter(object):
4242
def __init__(self):
4343
self.registry = []
4444

45-
def register(self, prefix, viewset, name):
46-
self.registry.append((prefix, viewset, name))
45+
def register(self, prefix, viewset, base_name=None):
46+
if base_name is None:
47+
base_name = self.get_default_base_name(viewset)
48+
self.registry.append((prefix, viewset, base_name))
49+
50+
def get_default_base_name(self, viewset):
51+
"""
52+
If `base_name` is not specified, attempt to automatically determine
53+
it from the viewset.
54+
"""
55+
raise NotImplemented('get_default_base_name must be overridden')
4756

4857
def get_urls(self):
58+
"""
59+
Return a list of URL patterns, given the registered viewsets.
60+
"""
4961
raise NotImplemented('get_urls must be overridden')
5062

5163
@property
@@ -91,6 +103,22 @@ class SimpleRouter(BaseRouter):
91103
),
92104
]
93105

106+
def get_default_base_name(self, viewset):
107+
"""
108+
If `base_name` is not specified, attempt to automatically determine
109+
it from the viewset.
110+
"""
111+
model_cls = getattr(viewset, 'model', None)
112+
queryset = getattr(viewset, 'queryset', None)
113+
if model_cls is None and queryset is not None:
114+
model_cls = queryset.model
115+
116+
assert model_cls, '`name` not argument not specified, and could ' \
117+
'not automatically determine the name from the viewset, as ' \
118+
'it does not have a `.model` or `.queryset` attribute.'
119+
120+
return model_cls._meta.object_name.lower()
121+
94122
def get_routes(self, viewset):
95123
"""
96124
Augment `self.routes` with any dynamically generated routes.

0 commit comments

Comments
 (0)