在django项目中导入应用程序

Bes*_*ung 5 python django python-import python-3.x

我在django项目中的另一个应用程序中导入应用程序时出现问题.我知道在这个问题上有几个问题/ asnwsers,相信我,我读了很多,甚至一些关于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
Run Code Online (Sandbox Code Playgroud)

我的第一个项目(/ home/user/project/was)包含virtualenv生成文件夹(python3.4).

我检查了我的python路径sys.path和Pycharm中的项目结构,并且/ home/user/project/was.

当我在PyCharm中执行此操作时,我自动完成工作正常:

from ..crew.models import MyClass #here i'm in a artists app file
Run Code Online (Sandbox Code Playgroud)

但我得到了一个 ValueError :attempted relative import beyond top-level package when import app

现在,同样的情况,在艺术家应用程序中导入一个船员类但是:

from was.crew.models import MyClass
Run Code Online (Sandbox Code Playgroud)

自动完成在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
Run Code Online (Sandbox Code Playgroud)

请注意,BASE_DIR设置中已存在.现在我可以这样做:

from crew.models import MyClass
Run Code Online (Sandbox Code Playgroud)

在这里我没有错误(更改Pycharm中的一些设置以使自动完成工作).

这有效,但我真的很想知道为什么我必须添加这一行以及为什么我的两次首次尝试都不起作用.

我有点迷失了包,pythonpath等(这就是我在我的架构中指定所有__init__.py文件的原因).

如果没有from ..anotherapp.models import Class在settings.py中删除任何东西,应该可以正常工作吗?

无论如何,我应该保留我的解决方案还是不是一件好事?

提前感谢您的回复.

PS:请注意我已经尝试__init__.py在我的第一个和第二个文件夹中有文件,但没有成功.

f43*_*d65 2

示例项目(有效)。

项目结构

test_project/
  test_project/
    settings.py
    urls.py
    wsgi.py 
  app1/
    models.py
  app2/
    models.py
Run Code Online (Sandbox Code Playgroud)

app1/models.py

from django.db import models

class Restaurant(models.Model):
    name = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

app2/models.py

from django.db import models
from app1.models import Restaurant

class Waiter(models.Model):
    restaurant = models.ForeignKey(Restaurant)
    name = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

在你的情况下, 和from ..crew.models import MyClassfrom crew.models import MyClass应该有效。我的猜测是,当您(或 PyCharm)位于应用程序目录中时,您(或 PyCharm)尝试运行某些文件或导入模块。当前目录(无论它意味着什么)应该是was(由 . 创建的目录django-admin.exe。希望它有帮助。