2010-04-11 42 views
18

我正在开发一个Django应用程序,它是一个需要多个子应用程序保持整洁的大型系统。因此,我有一个顶级目录,它是一个Django应用程序(因为它有一个空的models.py文件)和多个子目录,它们本身也是应用程序。Django子应用程序和模块结构

我以这种方式安排我的应用程序的原因是因为子应用程序是分开的,但它们永远不会在父应用程序之外使用。因此分开分发是没有意义的。

当安装了应用程序,设置文件必须包括这样的事情:

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

...这显然是不理想的。这也有一个令人讨厌的结果,即要求所有子应用程序都以其“内部”名称来引用(即subapp1subapp2等)。例如,如果我想重置subapp1数据库表,我必须键入:

python manage.py reset subapp1 

这是烦人,尤其是因为我有一个子应用程序称为core - 这很可能是冲突与其他应用程序的名称当我的应用程序安装在用户的项目中时。

我是否完全错误地执行此操作,或者是否已经迫使这些“内部”应用程序以全名引用?

+0

为什么这对您而言不是最理想的?你能澄清你想达到什么吗? – 2010-04-11 15:50:36

+0

只是因为,为了安装我的“应用程序”,需要在父模块内的每个应用程序,所以它真的是数据的重复。另外,如果我们添加任何子应用程序,则必须将它们添加到每个安装的已安装应用程序列表中。 – 2010-04-11 19:38:21

回答

12

你这样做是正确的,因为django本身就是这样做的。举例来说,管理员应用在INSTALLED_APPS中注册为django.contrib.admin,但要重置它,您必须使用manage.py reset admin,而manage.py reset django.contrib.admin不起作用

它可以被看作是在Django的错误...

但是,你应该叫不上名字的冲突会担心,因为你应该始终从的其余部分运行virtualenv环境中的Django,孤立python安装。这是比在普通Python安装上运行django更强大,更灵活的解决方案。更多信息,例如,在这里:http://mathematism.com/2009/jul/30/presentation-pip-and-virtualenv/

+1

我已经在使用virtualenv了,但这并不能解决问题 - 因为用户实际上很可能在他们的项目中创建一个名为“core”的应用程序,然后与我的“核心”应用程序发生冲突。 – 2010-04-11 19:39:04

+0

当然,这是一个限制。我提交了一个补丁:http://code.djangoproject.com/attachment/ticket/13323/applabel.diff 另请参阅相应的故障单。不过,我不确定问题是否完全解决。 – 2010-04-11 21:37:33

+0

我不知道这是在讨论,谢谢。票#3591看起来最有希望,但它不在1.2的列表中,所以我想我只需要解决问题,直到发生什么事情。我不喜欢为这个项目运行Django的自定义安装:)。 – 2010-04-12 09:58:29