我在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 *
但我无法理解为什么会这样,为什么当我导入特定功能时我得到了错误?
答案 0 :(得分:10)
您正在进行所谓的循环导入。
models.py:
from bm.bmApp.utils import to_safe_uppercase
utils.py:
from bm.bmApp.models import Client
现在执行import bm.bmApp.models
解释程序执行以下操作:
models.py - Line 1
:尝试导入bm.bmApp.utils
utils.py - Line 1
:尝试导入bm.bmApp.models
models.py - Line 1
:尝试导入bm.bmApp.utils
utils.py - Line 1
:尝试导入bm.bmApp.models
最简单的解决方案是在函数内移动导入:
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代码(这是一个很长的镜头......但值得消除)