Djangoのdatabase routerでImproperlyConfigured "cannot import name connection"

Djangoのdatabase routerはread/writeするdbを指定できる機能
Multiple databases | Django documentation | Django


ドキュメントを参考にして書いていて、ある特定のモデルの場合は、特別なDBをみるみたいなことをやろうとしたら以下のエラーになった。

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


サンプルだとこんな感じで、これがエラーになる

from polls.models import Poll

class PollRouter(object):
    def db_for_read(self, model, **hints):
        if model in [Poll]:
            return 'poll_db'
        return None

    def db_for_write(self, model, **hints):
        if model in [Poll]:
            return 'poll_db'
        return None

調べてみると、バグとして報告されていることがわかった
#20704 (DATABASE_ROUTERS : ImproperlyConfigured "cannot import name connection") – Django

1.6系では修正されているらしい


modelをimportしているのがよくないらしいので、例えばこんな感じにすれば回避できる。

class PollRouter(object):
    def db_for_read(self, model, **hints):
        if model.__name__ in ['Poll']:
            return "default"
        return None

    def db_for_write(self, model, **hints):
        if model.__name__ in ['Poll']:
            return "default"
        return None