为什么Django应用程序需要`manage.py`而不是使用`__init__py`?

问题描述 投票:3回答:1

我复制了一些manage.py线到我的__init__.py,我所有的viewsmodels都可以从任何地方导入而不需要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

python django django-settings django-manage.py
1个回答
1
投票
  1. 它有什么问题吗?它没有错!不同的开发团队有不同的偏好。虽然django是众所周知的(例如,所有表应该有一个名为id的自动增量主键字段),但是你想要加载应用程序的方式取决于你。
  2. 为什么不默认这样做?我可以想到几个原因。首先,有几个人拥有自己的可重用应用程序,或者甚至还有可以安装的pypi可用django应用程序。如果他们中的每个人都称为django.setup django将为每个应用程序设置一次。这也不会考虑在web服务器中运行的多个线程,以及application setup.,当您不一定需要时,可能会导致资源争用。最后,在您需要的情况下,您还会失去对应用程序设置和初始化顺序的一些控制,因为导入顺序现在是按字母顺序而不是通过INSTALLED_APPS。必须编写管理命令并通过manage.py使用它们似乎是为了与其他应用程序良好匹配而付出的代价。
© www.soinside.com 2019 - 2024. All rights reserved.