Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django子应用程序和;模块结构_Python_Django_Django Apps - Fatal编程技术网

Python Django子应用程序和;模块结构

Python Django子应用程序和;模块结构,python,django,django-apps,Python,Django,Django Apps,我正在开发一个Django应用程序,这是一个大型系统,需要多个子应用程序来保持整洁。因此,我有一个顶级目录,它是Django应用程序(因为它有一个空的models.py文件),还有多个子目录,它们本身也是应用程序 我以这种方式部署应用程序的原因是,子应用程序是分开的,但它们永远不会在父应用程序之外单独使用。因此,将它们分开分发是没有意义的 安装我的应用程序时,设置文件必须包括以下内容: INSTALLED_APPS = ( ... 'myapp', 'myapp.suba

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

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

安装我的应用程序时,设置文件必须包括以下内容:

INSTALLED_APPS = (
    ...
    'myapp',
    'myapp.subapp1',
    'myapp.subapp2',
    ...
)
…这显然是次优的。这还有一个略微令人讨厌的结果,即要求所有子应用程序都以其“内部”名称引用(即
subapp1
subapp2
等)。例如,如果要重置SubApp 1的数据库表,则必须键入:

python manage.py reset subapp1
这很烦人,尤其是因为我有一个名为
core
的子应用程序,当我的应用程序安装在用户的项目中时,它可能与另一个应用程序的名称冲突


我这样做是完全错误的,还是为了强迫这些“内部”应用程序被全名引用?

你这样做是正确的,因为django本身就是这样做的。例如,管理员应用程序在
已安装的应用程序中注册为
django.contrib.admin
,但要重置它,您必须使用
manage.py reset admin
,实际上,
manage.py reset django.contrib.admin
不起作用

它可以被认为是django中的一个bug


但是,您不应该担心名称冲突,因为您应该始终在
virtualenv
环境中运行django,与python安装的其余部分隔离。这是一个比在普通python安装上运行django更强大、更灵活的解决方案。更多信息,例如,请点击此处:

为什么这对您来说是次优的?你能澄清一下你想要实现什么吗?仅仅是因为,为了安装我的“应用程序”,父模块中的每个应用程序都是必需的,所以它实际上是重复数据。此外,如果我们添加任何子应用程序,它们必须添加到每个安装的已安装应用程序列表中。我已经在使用virtualenv,但这并不能解决问题-因为用户实际上很可能在其项目中创建名为
core
的应用程序,这将与我的
core
应用程序冲突。当然,这是一个限制。我提交了一个补丁:请参阅相应的票证。不过,我不确定这个问题是否完全解决了。我不知道正在讨论这个问题,谢谢。票子3591看起来最有希望,但它不在1.2的名单上,所以我想我必须解决这个问题,直到事情发生。我不喜欢为此项目运行Django的自定义安装:)。