处理多个应用覆盖 Django 管理命令

9 投票
2 回答
665 浏览
提问于 2025-04-17 09:13

我遇到了一个问题,就是在一个Django项目里,有多个应用程序试图覆盖同一个管理命令。

  1. 有没有什么合理的方法来解决这个问题?
  2. 优先级是怎样的?是先在INSTALLED_APPS里定义的应用优先,还是最后定义的应用优先?
  3. 有没有办法有效地继承最近定义的管理命令,而不是简单地替换掉它?

为了让大家更明白,我想让django_pdb(可以查看github)能更好地与southdjango.contrib.staticfiles配合使用。

2 个回答

1

我知道的最简单的答案是:把你的项目结构设计得合理,这样你就可以修改其中一个部分,并记录下你的修改,以便将来可以应用到新的版本中。

对于我的项目,我喜欢这样做:

/myproject
  /lib
    /app1
    /app2
    /app3

然后在setup.py中明确添加/lib到路径里。

import os
PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

import sys
lib_dir = os.path.join(PROJECT_PATH, 'lib')
if lib_dir not in sys.path[:4]:
    sys.path.insert(1, os.path.join(PROJECT_PATH, 'lib'))

我可能比一般人更喜欢拿一个应用程序,安装它,然后改动10%让它完全按照我的想法来工作。

这样做的好处是:1)大部分依赖项和代码一起打包,并且都在GIT中跟踪;2)如果你在同一台机器上运行多个应用程序,就不会因为系统范围的更改而意外导致某个应用出错;3)可以轻松修改应用中的任何内容,并且有修改历史记录。

虽然我没有深入研究south的管理命令,也从未使用过django_pdb,但你的具体问题可能无法通过“做一个本地副本并重命名其中一个”这种方法来解决,不过我分享这个想法,以防它能帮到你。

3

过了2年半,但如果有人遇到同样的问题并通过谷歌搜索来到这里,我做了一个小的django应用来解决这个问题:django-mcmo(“管理命令多重覆盖”),可以在pypi上找到。它有一些限制,但运行效果如预期。

这个应用支持django 1.4到1.8版本,以及Python 2和3,欢迎大家在bitbucket仓库上贡献代码。

撰写回答