11

Django管理コマンドのドキュメントには、app / management/commandsフォルダーに作成されているすべてのコマンドが示されています。アプリ/管理/コマンド/インストールやアプリ/管理/コマンド/メンテナンスなどのサブフォルダーにコマンドを配置することは可能ですか?これはどのように行われますか?

4

2 に答える 2

6

残念ながら、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、適切なスクリプトが読み込まれ、適切なクラスがインスタンス化されます。

しかし、実際的な観点からは、そうすることは役に立たないと思います。もちろん、「namespace'd」コマンドがあると便利ですが、必要に応じて、区切り文字として他の何か(など_)を使用して、すべてのコマンドの前に任意の名前を付けることができます。コマンド名の長さ(およびターミナルでコマンドを入力するために必要なキーストロークの数)は同じになります...

于 2012-10-09T03:12:45.307 に答える
0

これが私の例です:

app
- management
  - install
      __init__.py
      check1.py
  - maintenance
      __init__.py
      check2.py
  - commands
    __init__.py
    daily_cron.py

私が使用したのdaily_cron.pyは:

 from app.management.install import check1
 from app.management.maintenance import check2
 
 flag = check1(args)
 flag2 = check2(args)

__init__.py新しいフォルダごとに空のファイルを配置することを忘れないでください

于 2021-06-29T05:57:39.857 に答える