处理多个应用覆盖 Django 管理命令
我遇到了一个问题,就是在一个Django项目里,有多个应用程序试图覆盖同一个管理命令。
- 有没有什么合理的方法来解决这个问题?
- 优先级是怎样的?是先在
INSTALLED_APPS
里定义的应用优先,还是最后定义的应用优先? - 有没有办法有效地继承最近定义的管理命令,而不是简单地替换掉它?
为了让大家更明白,我想让django_pdb
(可以查看github)能更好地与south
和django.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仓库上贡献代码。