Django子应用和模块结构

19 投票
1 回答
8069 浏览
提问于 2025-04-15 21:29

我正在开发一个Django应用,这个应用比较大,需要多个子应用来保持结构清晰。因此,我有一个顶层目录,它是一个Django应用(因为里面有一个空的 models.py 文件),还有多个子目录,这些子目录本身也是应用。

我这样布局应用的原因是因为这些子应用是分开的,但它们永远不会单独使用,都是依赖于父应用的。所以,把它们单独分发出去是没有意义的。

在安装我的应用时,设置文件里必须包含类似这样的内容:

INSTALLED_APPS = (
    ...
    'myapp',
    'myapp.subapp1',
    'myapp.subapp2',
    ...
)

...这显然不是最优的做法。这还带来了一个小麻烦,就是所有的子应用都必须用它们的“内部”名称来引用(也就是 subapp1subapp2 等等)。举个例子,如果我想重置 subapp1 的数据库表,我必须输入:

python manage.py reset subapp1

这真的很烦人,尤其是因为我有一个叫 core 的子应用——当我的应用被安装到用户的项目里时,这个名字可能会和其他应用的名字冲突。

我这样做是不是完全错了,或者有没有办法强制这些“内部”应用用它们的全名来引用呢?

1 个回答

12

你这样做是对的,因为django本身就是这么做的。比如,管理后台这个应用在INSTALLED_APPS里注册为django.contrib.admin,但要重置它,你得用manage.py reset admin,而且实际上,manage.py reset django.contrib.admin 是行不通的

这可以算是django里的一个小bug……

不过,你不需要担心名字冲突的问题,因为你应该始终在一个virtualenv环境中运行django,这样就和其他的python安装隔离开了。这比在普通的python安装上运行django要强大和灵活得多。想了解更多信息,可以看看这里:http://mathematism.com/2009/jul/30/presentation-pip-and-virtualenv/

撰写回答