mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-02 11:30:12 +03:00
Merge 2bec7e6d8c
into 4338e1e43f
This commit is contained in:
commit
931ce1b8f1
|
@ -184,14 +184,17 @@ class SimpleRouter(BaseRouter):
|
|||
bound_methods[method] = action
|
||||
return bound_methods
|
||||
|
||||
def get_lookup_regex(self, viewset):
|
||||
def get_lookup_regex(self, viewset, lookup_prefix=''):
|
||||
"""
|
||||
Given a viewset, return the portion of URL regex that is used
|
||||
to match against a single instance.
|
||||
"""
|
||||
base_regex = '(?P<{lookup_field}>[^/]+)'
|
||||
if lookup_prefix:
|
||||
lookup_prefix += '_'
|
||||
|
||||
base_regex = '(?P<{lookup_prefix}{lookup_field}>[^/]+)'
|
||||
lookup_field = getattr(viewset, 'lookup_field', 'pk')
|
||||
return base_regex.format(lookup_field=lookup_field)
|
||||
return base_regex.format(lookup_field=lookup_field, lookup_prefix=lookup_prefix)
|
||||
|
||||
def get_urls(self):
|
||||
"""
|
||||
|
@ -270,3 +273,30 @@ class DefaultRouter(SimpleRouter):
|
|||
urls = format_suffix_patterns(urls)
|
||||
|
||||
return urls
|
||||
|
||||
|
||||
class NestedSimpleRouter(SimpleRouter):
|
||||
def __init__(self, parent_router, parent_prefix, *args, **kwargs):
|
||||
self.parent_router = parent_router
|
||||
self.parent_prefix = parent_prefix
|
||||
self.nest_count = getattr(parent_router, 'nest_count', 0) +1
|
||||
super(NestedSimpleRouter, self).__init__(*args, **kwargs)
|
||||
|
||||
parent_registry = filter(lambda registered: registered[0] == self.parent_prefix, self.parent_router.registry)
|
||||
try:
|
||||
parent_registry = parent_registry[0]
|
||||
parent_prefix, parent_viewset, parent_basename = parent_registry
|
||||
except:
|
||||
raise RuntimeError('parent registered resource not found')
|
||||
|
||||
nested_routes = []
|
||||
nest_prefix = 'nested_%i' % self.nest_count
|
||||
parent_lookup_regex = parent_router.get_lookup_regex(parent_viewset, nest_prefix)
|
||||
for route in self.routes:
|
||||
route_contents = route.__dict__
|
||||
parent_regex = '{parent_prefix}/{parent_lookup_regex}/'.format(parent_prefix=parent_prefix, parent_lookup_regex=parent_lookup_regex)
|
||||
|
||||
route_contents['url'] = route.url.replace('^', '^'+parent_regex)
|
||||
nested_routes.append(Route(**route_contents))
|
||||
|
||||
self.routes = nested_routes
|
||||
|
|
Loading…
Reference in New Issue
Block a user