在django models.py上导入错误

时间:2012-04-18 15:38:19

标签: python django

我在app direcroty上的utils.py上写了这个函数:

from bm.bmApp.models import Client

def get_client(user):
    try:
        client = Client.objects.get(username=user.username)
    except Client.DoesNotExist:
        print "User Does not Exist"
        return None
    else:       
        return client

def to_safe_uppercase(string):
    if string is None:
        return ''
    return string.upper()

然后当我在models.py文件中使用函数to_safe_uppercase时,通过以这种方式导入它:

from bm.bmApp.utils import to_safe_uppercase 

我收到了python错误:

     from bm.bmApp.utils import to_safe_uppercase
ImportError: cannot import name to_safe_uppercase

当我更改导入语句:

时,我得到了此问题的解决方案
from bm.bmApp.utils import *

但我无法理解为什么会这样,为什么当我导入特定功能时我得到了错误?

3 个答案:

答案 0 :(得分:10)

您正在进行所谓的循环导入。

models.py:

from bm.bmApp.utils import to_safe_uppercase

utils.py:

from bm.bmApp.models import Client

现在执行import bm.bmApp.models解释程序执行以下操作:

  1. models.py - Line 1:尝试导入bm.bmApp.utils
  2. utils.py - Line 1:尝试导入bm.bmApp.models
  3. models.py - Line 1:尝试导入bm.bmApp.utils
  4. utils.py - Line 1:尝试导入bm.bmApp.models
  5. ...
  6. 最简单的解决方案是在函数内移动导入:

    utils.py:

    def get_client(user):
        from bm.bmApp.models import Client
        try:
            client = Client.objects.get(username=user.username)
        except Client.DoesNotExist:
            print "User Does not Exist"
            return None
        else:       
            return client
    
    def to_safe_uppercase(string):
        if string is None:
            return ''
        return string.upper()
    

答案 1 :(得分:7)

您正在创建循环导入。

utils.py
from bm.bmApp.models import Client
# Rest of the file...

models.py
from bm.bmApp.utils import to_safe_uppercase
# Rest of the file...

我建议您的重构代码,以便您没有循环依赖(即utils不需要导入models.py,反之亦然)。

答案 2 :(得分:0)

我不确定我能解释导入错误,但我有三个想法。首先,你的功能需要调整。您使用了保留字'string'作为参数。考虑重命名。

其次,如果你调用./manage.py shell会发生什么,并手动执行导入。它能给你带来什么不同吗?

第三,尝试删除你的pyc文件以强制django重新编译python代码(这是一个很长的镜头......但值得消除)