Cómo personalizar la orden shell

El comando shell de Django es un entorno interactivo de Python que proporciona acceso a modelos y configuraciones, lo que lo hace útil para probar código, experimentar con consultas y interactuar con datos de la aplicación.

Personalizar el comando shell permite agregar funcionalidad adicional o cargar módulos específicos previamente. Para hacer esto, crea un nuevo comando de administración que subclase django.core.management.commands.shell.Command y sobreescriba el comando de administración existente shell. Para obtener más detalles, consulta la guía sobre sobrescrituras de comandos.

Personalizar las importaciones automáticas

Para personalizar el comportamiento de importación automática del comando de administración shell, sobreescriba el método get_auto_imports(). Este método debe devolver una secuencia de rutas de importación para objetos o módulos disponibles en la aplicación. Por ejemplo:

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",
        ]

La personalización anterior agrega resolve() y reverse() al espacio de nombres predeterminado, que ya incluye todos los modelos de las aplicaciones listadas en INSTALLED_APPS. Estos objetos estarán disponibles en el shell sin requerir una importación manual.

Ejecutar este comando personalizado shell con verbosity=2 mostraría:

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

Si un comando shell sobrescrito incluye rutas que no pueden ser importadas, se muestran estos errores cuando la verbosity está configurada en 1 o superior. Los imports duplicados son gestionados automáticamente.

Ten en cuenta que los imports automáticos pueden deshabilitarse para una sesión de shell específica utilizando la bandera --no-imports. Para deshabilitar permanentemente los imports automáticos, sobrescriba get_auto_imports() para que devuelva None:

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