为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?
Posted
技术标签:
【中文标题】为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?【英文标题】:Why do Django apps require `manage.py` for everything instead of using `__init__py`?为什么 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`? 【发布时间】:2019-09-10 03:02:59 【问题描述】:我复制了一些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')
这在导入数据或从项目夹具目录迁移数据时非常方便。
这有什么问题吗?如果不是,为什么你python manage.py startproject
时Django默认不这样做?
【问题讨论】:
【参考方案1】:-
有什么问题吗?它没有任何问题!不同的开发团队有不同的偏好。虽然 django 是出了名的固执己见(例如,所有表都应该有一个名为
id
的自动增量主键字段),但您希望如何加载应用程序取决于您。
为什么不默认这样做呢?我可以想到几个原因。首先,有几个人拥有自己的可重用应用程序,或者甚至可以安装 pypi 可用的 django 应用程序。如果他们每个人都称为django.setup
django 将为每个应用程序设置一次。这也不考虑在网络服务器中运行的多个线程,并且application setup. 在您不一定需要时可能会导致资源争用。最后,在需要的情况下,您还将失去对应用程序设置初始化顺序的一些控制,因为导入顺序现在是字母顺序而不是通过INSTALLED_APPS
。必须编写管理命令并通过 manage.py 使用它们似乎是为了与其他应用程序良好配合而付出的小代价。
【讨论】:
这很有意义。因此,如果我希望我的应用程序可重用,基本上我不应该这样做,因为它可能存在资源冲突或setup()
订单问题,我无法在我的环境中使用有限的 INSTALLED_APPS 集进行预期。但是在 django 项目级别就可以了。以上是关于为啥 Django 应用程序需要 `manage.py` 而不是使用 `__init__ py`?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在运行时出现整数精度错误:heroku run python manage.py migrate
为什么Django应用程序需要`manage.py`而不是使用`__init__py`?