【问题标题】:django database router cannot import name connectiondjango 数据库路由器无法导入名称连接
【发布时间】:2012-07-12 13:26:03
【问题描述】:

我对 Django 1.4 (python 2.6) 上的 DB 路由器有疑问。我已遵循文档(https://docs.djangoproject.com/en/dev/topics/db/multi-db/#automatic-database-routing)但是当我运行我的服务器时,我有以下错误消息:

django.core.exceptions.ImproperlyConfigured: Error importing database router MyDBRouter: "cannot import name connection"

我的设置.py

DATABASES = {
    'default': {
        ...
    },
    'other' : {
        ...
    }
}
DATABASE_ROUTERS = ['core.models.MyDBRouter',]

这里是 db 路由器代码:

class MyAppRouter(object):
    def db_for_read(self, model, **hints):
        "Point all operations on myapp models to 'other'"
        if model._meta.app_label == 'myapp':
            return 'other'
        return None

    def db_for_write(self, model, **hints):
        "Point all operations on myapp models to 'other'"
        if model._meta.app_label == 'myapp':
            return 'other'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        "Allow any relation if a model in myapp is involved"
        if obj1._meta.app_label == 'myapp' or obj2._meta.app_label == 'myapp':
            return True
        return None

    def allow_syncdb(self, db, model):
        "Make sure the myapp app only appears on the 'other' db"
        if db == 'other':
            return model._meta.app_label == 'myapp'
        elif model._meta.app_label == 'myapp':
            return False
        return None

我尝试将 None 替换为“默认”,但它仍然不起作用。

【问题讨论】:

  • 你展示了 core.models 的所有代码吗?可能有 connection 在其中引用/导入。
  • 是的,这是整个 models.py 文件...

标签: python database django


【解决方案1】:

我通过在 settings.py 上添加“from django.db import connections”解决了这个问题

151 # Database router                                                                                                                                       
152 from django.db import connections
153 DATABASE_ROUTERS         = ['core.models.MyDBRouter',]

现在服务器运行正常!但是路由器只是被django忽略了->要修复它,永远不要在模型中保存路由器!创建新文件

【讨论】:

  • 好吧,对于未来的流浪者:这可能是一个循环导入问题。如果您在与路由器相同的模块中的 init.py 文件中有任何导入 Django 模块的内容,那么您将遇到问题。所以我只是将我的 init.py 文件中的代码移动到另一个模块并从那里导入。
【解决方案2】:

这对我没有好处,我在这里https://stackoverflow.com/a/17888067/978912 发布了我的解决方案,也许它可以避免通过无尽的导入链进行调试的痛苦。 :)

【讨论】:

    【解决方案3】:

    就像Zakum 在他的解决方案中所说,

    如果上述解决方案不适合您,请查看您是否进行了导入

    from django.db.models import Model
    

    在您的任何路由文件中。如果是这样,您必须将其删除。

    【讨论】:

      【解决方案4】:

      对我来说,问题是在我的一个应用程序的__init__.py 文件中编码的。我认为init文件是settings.py文件的直接依赖,这可能会导致循环导入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-29
        • 2018-11-26
        • 2011-07-11
        • 2020-04-27
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        相关资源
        最近更新 更多