カスタム shell
コマンドの作り方¶
Djangoの shell
は、モデルと設定へのアクセスを提供する対話型の Python 環境であり、コードのテスト、クエリの実験、アプリケーションデータとのやりとりに役立ちます。
shell
コマンドをカスタマイズすることで、機能を追加したり、特定のモジュールをプリロードしたりできます。そのためには、 django.core.management.commands.shell.Command
のサブクラスを作成し、既存の shell
管理コマンドをオーバーライドする新しい管理コマンドを作成します。詳細については、 コマンドのオーバーライド に関するガイドを参照してください。
自動インポートをカスタマイズする¶
shell
管理コマンドの自動インポート動作をカスタマイズするには、 get_auto_imports()
メソッドをオーバーライドします。このメソッドは、アプリケーションで利用可能なオブジェクトまたはモジュールのインポートパスのシーケンスを返す必要があります。例えば:
polls/management/commands/shell.py
¶from django.core.management.commands import shell
class Command(shell.Command):
def get_auto_imports(self):
return super().get_auto_imports() + [
"django.urls.reverse",
"django.urls.resolve",
]
上記のカスタマイズにより、 resolve()
と reverse()
がデフォルトの名前空間に追加されます。この名前空間には、すでに INSTALLED_APPS
に含まれるアプリのすべてのモデルが含まれています。これらのオブジェクトは、 shell
内で手動でインポートすることなく利用できるようになります。
このようにカスタムした shell
コマンドを verbosity=2
を付けて実行すると、次のように表示されます:
8 objects imported automatically:
from django.contrib.admin.models import LogEntry
from django.contrib.auth.models import Group, Permission, User
from django.contrib.contenttypes.models import ContentType
from django.contrib.sessions.models import Session
from django.urls import resolve, reverse
オーバーライドされた shell
コマンドにインポートできないパスが含まれている場合、 verbosity
を 1
以上に設定するとエラーが表示されます。重複したインポートは自動的に処理されます。
特定の shell
セッションで自動インポートを無効にしたい場合は、 --no-imports
フラグを使用してください。自動インポートを恒久的に無効にするには、get_auto_imports()
をオーバーライドして None
を返すようにします:
class Command(shell.Command):
def get_auto_imports(self):
return None