在django models.py上导入错误

ala*_*ret 10 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()
Run Code Online (Sandbox Code Playgroud)

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

from bm.bmApp.utils import to_safe_uppercase 
Run Code Online (Sandbox Code Playgroud)

我得到了python错误:

     from bm.bmApp.utils import to_safe_uppercase
ImportError: cannot import name to_safe_uppercase
Run Code Online (Sandbox Code Playgroud)

当我更改import语句时,我得到了这个问题的解决方案:

from bm.bmApp.utils import *
Run Code Online (Sandbox Code Playgroud)

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

Jia*_*aro 12

您正在执行所谓的循环导入.

models.py:

from bm.bmApp.utils import to_safe_uppercase
Run Code Online (Sandbox Code Playgroud)

utils.py:

from bm.bmApp.models import Client
Run Code Online (Sandbox Code Playgroud)

现在,当您这样做时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. ...

最简单的解决方案是在函数内移动导入:

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()
Run Code Online (Sandbox Code Playgroud)


Mar*_*vin 8

您正在创建循环导入.

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...
Run Code Online (Sandbox Code Playgroud)

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


use*_*028 0

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

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

第三,尝试删除 pyc 文件以强制 django 重新编译 python 代码(这是一个非常遥远的目标......但值得消除)