diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 027a78cc13..70a1149ab4 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -144,7 +144,9 @@ def get_routes(self, viewset): Returns a list of the Route namedtuple. """ - known_actions = flatten([route.mapping.values() for route in self.routes if isinstance(route, Route)]) + # converting to list as iterables are good for one pass, known host needs to be checked again and again for + # different functions. + known_actions = list(flatten([route.mapping.values() for route in self.routes if isinstance(route, Route)])) # Determine any `@detail_route` or `@list_route` decorated methods on the viewset detail_routes = [] @@ -154,6 +156,7 @@ def get_routes(self, viewset): httpmethods = getattr(attr, 'bind_to_methods', None) detail = getattr(attr, 'detail', True) if httpmethods: + # checking method names against the known actions list if methodname in known_actions: raise ImproperlyConfigured('Cannot use @detail_route or @list_route ' 'decorators on method "%s" '