django项目目录结构和python路径

Tim*_*ony 6 python django django-models pythonpath

我正在尝试从一开始就为开发我的django项目获得最好的设置,并且我无法在目录结构中很好地完成所有内容.我已经设置了virtualenv(在这个例子中为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
Run Code Online (Sandbox Code Playgroud)

这是基本布局; 我希望每个项目都有一个应用程序目录,并且在每个应用程序中都有一个单独的文件夹,用于模型,视图和URL.

我遇到的问题是python路径以及如何处理模块.

在一个应用程序中,我不想在导入模型时引用该项目,即我应该使用:

import appname.models.modelname
Run Code Online (Sandbox Code Playgroud)

不:

import projectname.models.modelname
Run Code Online (Sandbox Code Playgroud)

帮助reusablility

在models目录中,我有以下init .py

from model1 import ModelName1
from model2 import ModelName2
from model3 import ModelName3

__all__ = ['ModelName1', 'ModelName2', 'ModelName3']
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用单独的url文件(在/appname/urls/urlfile.py中)并导入模型时,如下所示:

from appname.models.somemodel import ModelName
Run Code Online (Sandbox Code Playgroud)

我收到"找不到模块"错误.

而:

from appsfolder.appname.models.somemodel import ModelName
Run Code Online (Sandbox Code Playgroud)

工作正常

我认为这是因为应用程序不是直接在python路径上,而是在一个名为appsfolder的子文件夹中,但我不知道如何修复它,同时保持一切可重用和相对.

我知道一个解决方案是将所有应用程序直接放在site-packages下的python路径上,但我真的不喜欢这个想法,因为我认为如果你使用virtualenv的应用程序应该在项目中

Ber*_*ant 15

您可以将以下内容settings.py添加appsfolder到您的PYTHONPATH:

import os
import sys

PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))
Run Code Online (Sandbox Code Playgroud)