From c8873bbba76bc52ab0766f98e8537b2fa66be71c Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Wed, 27 Jan 2010 07:56:53 +0000 Subject: Made the database master router tolerant of router definitions that omit individual routing methods. git-svn-id: http://code.djangoproject.com/svn/django/trunk@12304 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/db/utils.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'django') diff --git a/django/db/utils.py b/django/db/utils.py index 1b3218e34c..da34570a76 100644 --- a/django/db/utils.py +++ b/django/db/utils.py @@ -103,9 +103,13 @@ class ConnectionRouter(object): def _route_db(self, model, **hints): chosen_db = None for router in self.routers: - chosen_db = getattr(router, action)(model, **hints) - if chosen_db: - return chosen_db + try: + chosen_db = getattr(router, action)(model, **hints) + if chosen_db: + return chosen_db + except AttributeError: + # If the router doesn't have a method, skip to the next one. + pass try: return hints['instance']._state.db or DEFAULT_DB_ALIAS except KeyError: @@ -117,14 +121,22 @@ class ConnectionRouter(object): def allow_relation(self, obj1, obj2, **hints): for router in self.routers: - allow = router.allow_relation(obj1, obj2, **hints) - if allow is not None: - return allow + try: + allow = router.allow_relation(obj1, obj2, **hints) + if allow is not None: + return allow + except AttributeError: + # If the router doesn't have a method, skip to the next one. + pass return obj1._state.db == obj2._state.db def allow_syncdb(self, db, model): for router in self.routers: - allow = router.allow_syncdb(db, model) - if allow is not None: - return allow + try: + allow = router.allow_syncdb(db, model) + if allow is not None: + return allow + except AttributeError: + # If the router doesn't have a method, skip to the next one. + pass return True -- cgit v1.3