如何自定义 shell 命令

Django的 shell 是一个交互式Python环境,提供对模型和设置的访问,使其对于测试代码、实验查询以及与应用程序数据交互很有用。

自定义 shell 命令允许添加额外功能或预加载特定模块。为此,请创建一个新的管理命令,该命令将其进行子分类 django.core.management.commands.shell.Command 并覆盖现有的 shell 管理命令。有关详细信息,请参阅 overriding commands .

自定义自动导入

New in Django 5.2.

要自定义的自动导入行为 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