---
title: "如何自定义 shell 命令"
version: 6.0
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/6.0/howto/custom-shell/
canonical: https://djangodocs.dev/zh-hans/6.0/howto/custom-shell/
---
# 如何自定义 `shell` 命令

Django 的 [`shell`](/zh-hans/6.0/ref/django-admin/#django-admin-shell) 是一个交互式 Python 环境，它提供了对模型和设置的访问，使其适用于测试代码、尝试查询以及与应用程序数据交互。

自定义 [`shell`](/zh-hans/6.0/ref/django-admin/#django-admin-shell) 命令允许添加额外功能或预加载特定模块。要实现此功能，需新建一个继承自 `django.core.management.commands.shell.Command` 的管理命令，并覆盖现有的 `shell` 管理命令。更多详细信息，请参阅关于 [覆盖命令](/zh-hans/6.0/howto/custom-management-commands/#overriding-commands) 的指南。

## 自定义自动导入

> **New in Django 5.2**

要自定义 [`shell`](/zh-hans/6.0/ref/django-admin/#django-admin-shell) 管理命令的自动导入行为，需重写 `get_auto_imports()` 方法。此方法应返回应用程序中可用对象或模块的一系列导入路径。例如：

*`polls/management/commands/shell.py`*

```python
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()`](/zh-hans/6.0/ref/urlresolvers/#django.urls.resolve) 和 [`reverse()`](/zh-hans/6.0/ref/urlresolvers/#django.urls.reverse) 添加至默认命名空间，该命名空间已包含 [`INSTALLED_APPS`](/zh-hans/6.0/ref/settings/#std-setting-INSTALLED_APPS) 中列出的所有应用程序模型。这些对象将在 `shell` 中直接可用，无需手动导入。

以 `verbosity=2` 参数运行此自定义的 `shell` 命令将显示：

```console
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
```

> **Changed in Django 6.0**
>
> 添加了对常见工具（如 `django.conf.settings`）的自动导入功能。

如果被覆盖的 `shell` 命令包含无法导入的路径，当 `verbosity` 设置为 `1` 或更高时，将显示这些错误。重复导入会被自动处理。

请注意，可以在特定的 `shell` 会话中使用 [`--no-imports`](/zh-hans/6.0/ref/django-admin/#cmdoption-shell-no-imports) 选项标志来禁用自动导入。若要永久禁用自动导入，可重写 `get_auto_imports()` 方法使其返回 `None`：

```
class Command(shell.Command):
    def get_auto_imports(self):
        return None
```
