【问题标题】:Error importing class in django在 django 中导入类时出错
【发布时间】:2015-02-14 20:04:59
【问题描述】:

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

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 版本

【问题讨论】:

  • customer/models.py 是否导入 callbacks.py?您可能在此处进行循环导入。
  • 是的...但是如何在 models.py 文件上使用我的回调?
  • 有多种方法可以做到这一点,但最好的方法取决于您使用的 Django 版本。您使用的是哪个版本?如有必要,您介意升级吗?
  • the right place to keep my signals.py files in django 的可能副本。您还需要将信号注册移至callbacks.py 文件(即移出models.py 文件,并删除循环导入)。
  • @ThomasOrozco 但在 django 文档中说注册最好在 models.py 中完成:“这段代码应该放在哪里?你可以将信号处理和注册代码放在任何你喜欢的地方。但是,你'需要确保尽早导入它所在的模块,以便在需要发送任何信号之前注册信号处理。这使您的应用程序的 models.py 成为注册信号处理程序的好地方。“

标签: python django


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 2012-03-14
    • 2014-11-26
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多