在django中导入类时出错

时间:2014-12-16 13:33:03

标签: python django

我有一个名为customer的django应用程序。在customer.models里面我有一些模型类,其中一个是Tooth。我还在我的应用程序目录中创建了一个名为callbacks.py的新python文件,以存储一些signla的回调函数。我所做的是以下

from customer.models import Tooth

def callback(sender, **kwargs)
    #using Tooth here

和models.py

from customer.callbacks import callback
#.....
post_save.connect(callback, sender=Customer)

但是当我尝试运行sqlall时出现导入错误

    from customer.models import Tooth
ImportError: cannot import name Tooth

其他所有其他导入工作正常。

编辑:使用Django 1.6版本

1 个答案:

答案 0 :(得分:1)

这是循环导入。

以下是发生的事情:

  • Django加载模型
  • 因此,django导入customer.models
  • Python执行customer/models.py的内容以计算模块的属性
  • customers/models.py导入customer/callbacks.py
  • Python暂时执行customer/models.py并开始执行customer/callbacks.py
  • callbacks.py尝试导入正在导入的models.py。 Python防止双重导入模块并引发ImportError。

通常这种情况显示设计不佳。但有时(这似乎是你的情况)紧密耦合是必需的。解决此问题的一种快速而肮脏的方法是延迟循环导入,在您的情况下:

models.py

from customer.callbacks import callback

# Define Tooth

post_save.connect(callback, sender=Customer)

callbacks.py

def callback(sender, **kwargs)
    from customer.models import Tooth
    # Use Tooth