我在开发 Django 项目时,遇到了目录结构和 Python 路径相关的问题。我使用虚拟环境(例如 env)为每个 Django 项目部署一个干净的 Python 环境。我的基本目录结构如下:
/env/
/bin
/db <--- Django DB
/downloads
/lib
/static <--- Where css/imgs/js etc is served from
/project/ <--- Django root
/__init__.py
/settings.py
/manage.py
/appsfolder/
/appname/
/__init__.py
/models/
/__init__.py
/somemodel.py
/urls/
/__init__.py
/someurl.py
/views/
/__init__.py
/someview.py
我希望每个项目都有一个用于应用程序的目录(例如 appsfolder),并且在每个应用程序中都有一个单独用于模型、视图和 URL 的目录。我遇到的问题在于 Python 路径和模块处理。在应用程序中,我不希望在导入模型时引用项目,即我应该使用:
import appname.models.modelname
而不是:
import projectname.models.modelname
这有助于提高代码的可重用性。
在 models 目录中,我有以下 __init__.py 代码:
from model1 import ModelName1
from model2 import ModelName2
from model3 import ModelName3
__all__ = ['ModelName1', 'ModelName2', 'ModelName3']
但是,当我尝试使用单独的 URL 文件(位于 /appname/urls/urlfile.py)并导入模型时,例如:
from appname.models.somemodel import ModelName
我会收到一个 "module not found" 错误。但是,如果我使用以下代码,则可以正常工作:
from appsfolder.appname.models.somemodel import ModelName
我猜想这是因为应用程序不在 Python 路径上,而是位于名为 appsfolder 的子文件夹中,但我不确定如何解决这个问题,同时保持代码的可重用性和相对性。
我知道有一种解决方案是将所有应用程序直接放在 Python 路径下的 site-packages 文件夹中,但我并不喜欢这个主意,因为我认为应用程序应该在项目中,尤其是当你使用虚拟环境时。
2. 解决方案
您可以将以下内容添加到您的 settings.py 文件中,以将 appsfolder 添加到您的 PYTHONPATH 中:
import os
import sys
PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))
这将允许您在应用程序中使用以下导入:
from appname.models.somemodel import ModelName
而不会收到 "module not found" 错误。
代码示例
以下是一个完整的 settings.py 文件示例,其中包含上述代码:
import os
import sys
# Define the project root directory
PROJECT_ROOT = os.path.dirname(__file__)
# Add the apps folder to the Python path
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))
# Django settings
# ...
现在,您可以在应用程序中使用以下导入:
from appname.models.somemodel import ModelName
而不会遇到任何错误。