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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么Django应用程序需要`manage.py`而不是使用`__init__py`?相关的知识,希望对你有一定的参考价值。

我复制了一些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

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

以上是关于为什么Django应用程序需要`manage.py`而不是使用`__init__py`?的主要内容,如果未能解决你的问题,请参考以下文章

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

什么时候应该使用 django-admin.py 和 manage.py?

使用 manage.py shell 更改 Django 站点显示名称?

如何使用 Django 中的 manage.py CLI 从数据库中删除所有表?

django创建项目后,项目名称的目录下还有一个项目名称的文件夹?manage.py在文件夹外。

在 Django 中使用 manage.py 从 CLI 清除数据库的最简单方法是啥?