为啥 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 并且我所有的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')

这在导入数据或从项目夹具目录迁移数据时非常方便。

这有什么问题吗?如果不是,为什么你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`?

Django学习之三:django-admin 和 项目manage.py程序

为啥我不能在 Django 项目中导入模块?

django manager

Django `python manage.py runserver` 不支持 asyncio&aiohttp