Просмотр исходного кода

Delayed settings.DATABASE_ROUTERS usage by ConnectionRouter

Refs #20474.
Claude Paroz 12 лет назад
Родитель
Сommit
6a6bb168be
2 измененных файлов с 14 добавлено и 6 удалено
  1. 1 2
      django/db/__init__.py
  2. 13 4
      django/db/utils.py

+ 1 - 2
django/db/__init__.py

@@ -1,6 +1,5 @@
 import warnings
 
-from django.conf import settings
 from django.core import signals
 from django.db.utils import (DEFAULT_DB_ALIAS,
     DataError, OperationalError, IntegrityError, InternalError,
@@ -14,7 +13,7 @@ __all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError',
 
 connections = ConnectionHandler()
 
-router = ConnectionRouter(settings.DATABASE_ROUTERS)
+router = ConnectionRouter()
 
 # `connection`, `DatabaseError` and `IntegrityError` are convenient aliases
 # for backend bits.

+ 13 - 4
django/db/utils.py

@@ -214,14 +214,23 @@ class ConnectionHandler(object):
 
 
 class ConnectionRouter(object):
-    def __init__(self, routers):
-        self.routers = []
-        for r in routers:
+    def __init__(self, routers=None):
+        """
+        If routers is not specified, will default to settings.DATABASE_ROUTERS.
+        """
+        self._routers = routers
+
+    @cached_property
+    def routers(self):
+        if self._routers is None:
+            self._routers = settings.DATABASE_ROUTERS
+        for r in self._routers:
             if isinstance(r, six.string_types):
                 router = import_by_path(r)()
             else:
                 router = r
-            self.routers.append(router)
+            self._routers.append(router)
+        return self._routers
 
     def _router_func(action):
         def _route_db(self, model, **hints):