如何自定义 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",
]
The customization above adds resolve() and
reverse() to the default namespace, which already includes
all models from the apps listed in INSTALLED_APPS plus what is
imported by default. These objects will be available in the shell without
requiring a manual import.
以 verbosity=2 参数运行此自定义的 shell 命令将显示:
13 objects imported automatically:
from django.db import connection, reset_queries, models
from django.conf import settings
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
from django.utils import timezone
Automatic imports of common utilities, such as django.conf.settings,
were added.
如果被覆盖的 shell 命令包含无法导入的路径,当 verbosity 设置为 1 或更高时,将显示这些错误。重复导入会被自动处理。
请注意,可以在特定的 shell 会话中使用 --no-imports 选项标志来禁用自动导入。若要永久禁用自动导入,可重写 get_auto_imports() 方法使其返回 None:
class Command(shell.Command):
def get_auto_imports(self):
return None