我在django项目中的另一个应用中导入应用时出现问题。 我知道在这个问题上有几个问题/ asnwsers,相信我,我读了很多,甚至一些关于python导入。
这是我的项目树(我会把真正的文件夹名称):
Waiting for device.
Target device: motorola_solutions-tc55-13357521650478
Uploading file
local path: C:\Ausbildung\Uebungen\Applications\MotoSDKTest\app\build\outputs\apk\app-debug.apk
remote path: /data/local/tmp/com.iwr.smith.motosdktest
Installing com.iwr.smith.motosdktest
DEVICE SHELL COMMAND: pm install -r "/data/local/tmp/com.iwr.smith.motosdktest"
pkg: /data/local/tmp/com.iwr.smith.motosdktest
Failure [INSTALL_FAILED_MISSING_SHARED_LIBRARY]
我的第一个项目(/ home / user / project / was)包含virtualenv生成文件夹(python3.4)。
我检查了我的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
和Pycharm中的项目结构,并且/ home / user / project /是。
当我在PyCharm中执行此操作时,我自动完成工作正常:
sys.path
但我得到from ..crew.models import MyClass #here i'm in a artists app file
现在,同样的情况,在艺术家应用程序中导入一个船员类但是:
ValueError :attempted relative import beyond top-level package when import app
自动完成在pycharm中工作正常,但这次我得到了经典的ImportError:from was.crew.models import MyClass
。
我通过在settings.py中添加此行找到了解决方案:
no name was.crew
请注意,设置中已存在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
在这里我没有错误(更改Pycharm中的一些设置以使自动完成工作)。
这样可行,但我真的很想知道为什么我必须添加这一行以及为什么我的两次首次尝试都不起作用。
我对包,pythonpath等有点迷失(这就是为什么我在我的架构中指定了所有from crew.models import MyClass
个文件)。
如果没有在settings.py中删除任何内容,__init__.py
不应该正常工作吗?
无论如何,我应该保留我的解决方案还是不是一件好事?
提前感谢您的回复。
PS:请注意我已尝试在我的第一个和第二个文件夹中包含from ..anotherapp.models import Class
个文件,但没有成功。
答案 0 :(得分:2)
示例项目(有效)。
项目结构
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 MyClass
和from crew.models import MyClass
都应该有效。我的猜测是当你(或PyCharm)在app目录中时你(或PyCharm)尝试运行一些文件或导入模块。当前目录(无论它意味着什么)应该是was
(由django-admin.exe
创建的目录。希望它有所帮助。
答案 1 :(得分:2)
在django项目中,您不需要提供从根目录到项目目录的路径。另外,BASE_DIR是您的django项目的路径,当您在django中导入任何应用程序时,只需使用其名称导入它。
所以你的导入就是。
from crew.models import MyClass