我复制了一些manage.py
线到我的__init__.py
,我所有的views
和models
都可以从任何地方导入而不需要python manage.py shell
:
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
django.setup()
这样我可以在__init__.py
中导入我的子模块(进一步向下):
import glob
modules = glob.glob(os.path.join(os.path.dirname(__file__), '*.py'))
__all__ = [os.path.basename(f)[:-3] for f in modules
if os.path.isfile(f) and not f.endswith('__init__.py')]
from . import *
这样我可以从任何目录执行此操作:
import myproject as mp
mp.models.MyModel.objects.get(field_name='value')
从项目fixtures目录导入数据或进行数据迁移时,这很方便。
这有什么不对吗?如果没有,为什么Django默认情况下这样做,当你python manage.py startproject
?
id
的自动增量主键字段),但是你想要加载应用程序的方式取决于你。django.setup
django将为每个应用程序设置一次。这也不会考虑在web服务器中运行的多个线程,以及application setup.,当您不一定需要时,可能会导致资源争用。最后,在您需要的情况下,您还会失去对应用程序设置和初始化顺序的一些控制,因为导入顺序现在是按字母顺序而不是通过INSTALLED_APPS
。必须编写管理命令并通过manage.py使用它们似乎是为了与其他应用程序良好匹配而付出的代价。