2012-08-25 23 views
5

Django管理命令文档显示了在app/management/commands文件夹中创建的所有命令。是否可以将命令放入子文件夹中,如app/management/commands/install和app/management/commands/maintenance?这将如何完成?Django:将管理命令拆分为子文件夹

+1

您能给出有关您的问题的更多详细信息吗?你在找什么? https://docs.djangoproject.com/en/dev/howto/custom-management-commands/ – Marat

+0

我想把命令放到app/management/commands的子文件夹中。我为这个问题添加了更多细节。 –

回答

5

不幸的是,从Django 1.4开始,似乎没有办法做到这一点。为django.core.management.__init__.py来源有这样的方法:

def find_commands(management_dir): 
    """ 
    Given a path to a management directory, returns a list of all the command 
    names that are available. 

    Returns an empty list if no commands are defined. 
    """ 
    command_dir = os.path.join(management_dir, 'commands') 
    try: 
     return [f[:-3] for f in os.listdir(command_dir) 
       if not f.startswith('_') and f.endswith('.py')] 
    except OSError: 
     return [] 

正如你所看到的,只考虑文件直接在commands文件夹内,忽略任何子文件夹。但是,如果“猴子补丁”这个功能不知何故,其余代码应该可以正常工作,因为实际创建Command实例的代码是这样的:

def load_command_class(app_name, name): 
    """ 
    Given a command name and an application name, returns the Command 
    class instance. All errors raised by the import process 
    (ImportError, AttributeError) are allowed to propagate. 
    """ 
    module = import_module('%s.management.commands.%s' % (app_name, name)) 
    return module.Command() 

所以,如果你有一个命令叫subfolder.command它会加载正确的脚本并实例化正确的类。

然而,从实际的角度来看,我看不出这样做的用处。当然,拥有“命名空间”命令会很好,但是如果你愿意的话,你总是可以用某个名字作为前缀,如果使用别的东西作为分隔符(如_)。命令名称长度 - 以及在终端中键入它们所需的击键次数 - 将相同...