我在我的Django项目中的一个应用程序导入另一个应用程序时遇到了问题。
我知道关于这个主题有许多问题/答案,相信我,我阅读了很多,甚至包括一些有关Python导入的内容。
这是我的项目树(我将放置真实的文件夹名称):
was/ # full path from my computer /home/user/project/was
....was/ #django project created by django-admin startproject 'was'
....manage.py
....artists/ #first app
....migrations/
....templates/
....__init__.py
....other_python_files.py
....crew/ #second app
....migrations/
....templates/
....__init__.py
....some_files.py
....was/ # folder containing settings.py, main urls.py
....__init__.py
我的第一个项目(/home/user/project/was)包含了虚拟环境生成的文件夹(python3.4)。
我在PyCharm中检查了我的Python路径sys.path
和我的项目结构,发现有/home/user/project/was。
在PyCharm中这样做时,自动补全功能工作得很好:
from ..crew.models import MyClass #here i'm in a artists app file
但是当我导入应用程序时,出现了ValueError:尝试相对于顶级包进行相对导入
现在,同样的情况,在艺术家应用程序中导入一个乘组类,但是:
from was.crew.models import MyClass
在PyCharm中,自动完成功能正常,但这一次我遇到了经典的ImportError:no name was.crew
。
我发现通过在我的settings.py文件中添加以下行可以解决问题:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.join(BASE_DIR)) # add this line
请注意,
BASE_DIR
已经存在于设置中。
现在我可以这样做:from crew.models import MyClass
在这里我没有错误(在Pycharm中更改一些设置使自动完成起作用)。
这个方法可以,但我真的很想知道为什么要添加这行代码以及为什么我的前两次尝试不起作用。
我对包、pythonpath等有点迷茫(这就是为什么我在模式中指定了所有的__init__.py
文件)。
难道 from ..anotherapp.models import Class
不需要在settings.py中进行任何修改?
无论如何,我应该保留我的解决方案还是不好吗?
感谢您提前给予任何回复。
附注:请注意,我已经尝试在我的第一个和第二个文件夹中添加了__init__.py
文件,但没有成功。
from crew.models import MyClass
可以很好地工作。感谢您的回答。 - Bestasttung