Python 在django项目中导入应用程序
我在django项目的另一个应用程序中导入应用程序时遇到问题。 我知道在这个主题上有几个问题,相信我,我读了很多,甚至有一些关于python导入的 这是我的项目树(我将输入文件夹的真实名称): 我的第一个was项目(/home/user/project/was)包含virtualenv生成文件夹(python3.4) 我检查了python路径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
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文档