Python 在django项目中导入应用程序

Python 在django项目中导入应用程序,python,django,python-3.x,python-import,Python,Django,Python 3.x,Python Import,我在django项目的另一个应用程序中导入应用程序时遇到问题。 我知道在这个主题上有几个问题,相信我,我读了很多,甚至有一些关于python导入的 这是我的项目树(我将输入文件夹的真实名称): 我的第一个was项目(/home/user/project/was)包含virtualenv生成文件夹(python3.4) 我检查了python路径sys.path和Pycharm中的项目结构,其中有/home/user/project/was 在PyCharm中执行此操作时,自动完成功能运行良好: f

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

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

我的第一个was项目(/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:当导入应用程序时,尝试了超出顶级包的相对导入

现在,同样的场景,在artists应用程序中导入crew类,但:

from was.crew.models import MyClass
自动完成在pycharm中运行得很好,但这次我得到了一个经典的importorror:
没有名字was.crew

通过在my 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\u DIR
已存在于设置中。 现在我可以做到:

from crew.models import MyClass
在这里我没有得到任何错误(更改Pycharm中的一些设置以使自动完成工作)

这是可行的,但我真的想知道为什么我必须添加这一行,为什么我的两次第一次尝试都不起作用

我对package、pythonpath等有点不知所措(这就是为什么我在模式中指定了所有
\uuu init\uuu.py
文件)

不应该从..anotherapp.models导入类
工作正常而不在settings.py中拉皮条吗

不管怎样,我应该保留我的解决方案还是这不是一件好事

提前感谢您的回复

PS:请注意,我已经尝试在我的第一个和第二个was文件夹中包含
\uuu init\uuu.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)
from django.db import models
from app1.models import Restaurant

class Waiter(models.Model):
    restaurant = models.ForeignKey(Restaurant)
    name = models.CharField(max_length=255)
app2/models.py

from django.db import models

class Restaurant(models.Model):
    name = models.CharField(max_length=255)
from django.db import models
from app1.models import Restaurant

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

在您的情况下,..crew.models导入MyClass的
和crew.models导入MyClass的
都应该可以工作。我的猜测是,当您(或PyCharm)在应用程序目录中时,您(或PyCharm)尝试运行一些文件或导入模块。当前目录(无论它是什么意思)应该是
was
(由django admin.exe创建的那一个。希望有帮助。

在django项目中,您不需要给出从根目录到项目目录的路径。此外,BASE_DIR是django项目的路径。当您在django中导入任何应用程序时,您只需使用其名称导入它

因此,您的导入将是

from crew.models import MyClass

当我启动我的服务器et go to localhost:8000时,该错误实际上会触发。是的,它应该可以工作(实际上在pycharm中工作,它会检索我的应用程序树)但是django引发了错误。这可能是virtualenv python lib在文件夹树中放置得太高的问题吗?我在问题中写到了这些。无论我从python路径中删除条目并执行app1.models,似乎都可以在设置中不使用我的行。感谢您的回答!是的,现在我删除了python路径中的条目(我强制的条目)它可以工作。不知道为什么,但通过从crew.models import MyClass编写
可以工作。谢谢你的回答。@bestast这是我的荣幸。它可以工作,因为django项目的settings.py中的BASE_DIR映射了django应用程序的路径。请签出此django文档