The Django shell is an interactive Python environment that provides access to models and settings, making it useful for testing code, experimenting with queries, and interacting with application data.
Customizing the shell command allows adding extra functionality or pre-loading specific modules. To do this, create a new management command that subclasses django.core.management.commands.shell.Command and overrides the existing shell management command. For more details, refer to the guide on overriding commands.
To customize the automatic import behavior of the shell management command, override the get_auto_imports() method. This method should return a sequence of import paths for objects or modules available in the application. For example:
polls/management/commands/shell.pyfrom 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.
Running this customized shell command with verbosity=2 would show:
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.
If an overridden shell command includes paths that cannot be imported, these errors are shown when verbosity is set to 1 or higher. Duplicate imports are automatically handled.
Note that automatic imports can be disabled for a specific shell session using the --no-imports flag. To permanently disable automatic imports, override get_auto_imports() to return None:
class Command(shell.Command):
def get_auto_imports(self):
return None
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/howto/custom-shell/