在 django 项目中导入应用程序

Import app in django project

我在 Django 项目的另一个应用程序中导入一个应用程序时遇到问题。 我知道有好几本 question/asnwsers 关于这个主题,相信我,我读了很多,甚至一些关于 python import.

这是我的项目树(我会输入真实的文件夹名称):

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) 包含 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

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

现在,同样的情况,在艺术家应用程序中导入工作人员 class 但是:

from was.crew.models import MyClass

Autocompletion 在 pycharm 中工作正常,但这次我得到了 classic 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 中的一些设置以使自动完成工作)。

这行得通,但我真的想知道为什么我必须添加这一行以及为什么我的两次第一次尝试都行不通。

我对包、python路径等有点迷茫(这就是为什么我在我的架构中指定了所有 __init__.py 文件)。

不应该 from ..anotherapp.models import Class 在 settings.py 中不拉皮条就可以正常工作吗?

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

提前感谢您的回复。

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

示例项目(有效)。

项目结构

test_project/
  test_project/
    settings.py
    urls.py
    wsgi.py 
  app1/
    models.py
  app2/
    models.py

app1/models.py

from django.db import models

class Restaurant(models.Model):
    name = models.CharField(max_length=255)

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)

在您的情况下,from ..crew.models import MyClassfrom crew.models import MyClass 都应该有效。我的猜测是当你(或PyCharm)在应用程序目录中时,你(或PyCharm)试图运行一些文件或导入模块。当前目录(无论它是什么意思)应该是 was(由 [=16= 创建的目录)。希望它有帮助。

在 django 项目中,您不需要提供从根目录到项目的路径 directory.Also BASE_DIR 是您的 django 项目的路径,当您在 django 中导入任何应用程序时,您只需导入它使用它的名字。

因此您的导入将是。

from crew.models import MyClass

我觉得对你有帮助!我在同样的问题上挣扎了几天。我已经准备好所有 init.py 文件。我最终不得不将源根目录设置为 project_dir:

右键单击 project_dir,将目录标记为 > Sources Root

这很有帮助!