@@ -42,10 +42,22 @@ class BaseRouter(object):
42
42
def __init__ (self ):
43
43
self .registry = []
44
44
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' )
47
56
48
57
def get_urls (self ):
58
+ """
59
+ Return a list of URL patterns, given the registered viewsets.
60
+ """
49
61
raise NotImplemented ('get_urls must be overridden' )
50
62
51
63
@property
@@ -91,6 +103,22 @@ class SimpleRouter(BaseRouter):
91
103
),
92
104
]
93
105
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
+
94
122
def get_routes (self , viewset ):
95
123
"""
96
124
Augment `self.routes` with any dynamically generated routes.
0 commit comments