Puede ser una buena idea, para un proyecto de django, tener scripts externos que realicen tareas concretas. Para generar estos scripts, vamos a usar la opción, que tiene django a partir de la versión 1.0, de crear subcomandos para
"manage.py". Una vez creado el subcomando, para ejecutar el script, simplemente habrá que ejecutar el fichero
"manage.py" pasándole como parámetro nuestro subcomando.
En la
página de django, nos muestran como se crean los subcomandos.
Writing custom django-admin commands.
La metodología para crear los subcomandos es muy fácil, en el directorio de una app de django, hay que crear unos directorios y unos ficheros. El fichero que contiene el código del subcomando, tendrá el nombre del subcomando con la extensión
"py". Veamos como quedaría el directorio de la app si el nombre del subcomando fuese "my_subcommand":
app/
__init__.py
models.py
management/
__init__.py
commands/
__init__.py
my_subcommand.py
tests.py
views.py
Por los tanto los ficheros que hay que crear son:
- management/__init__.py
- management/commands/__init__.py
- management/commands/my_subcommand.py
Es importante crear los ficheros __init__.py. Estos ficheros están en blanco, pero indican que los directorios son módulos de python.
En el fichero
"management/commands/my_subcommand.py", es donde hay que escribir el código del subcomando.
Como ejemplo, voy a poner un subcomando de
"manage.py" que muestre el texto "Hello world!".
Dentro del directorio de cualquier aplicación del proyecto, tiene que estar añadida la aplicación a INSTALLED_APPS, creamos los siguientes ficheros:
- management/__init__.py
- management/commands/__init__.py
- management/commands/hello_world.py
Los ficheros __init__.py están vacíos, y en
"management/commands/hello_world.py" copiamos el siguiente código.
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'check unchecked votes'
def handle(self, *args, **options):
print "Hello world!"
Para ejecutar el script, hay que ir al directorio principal del proyecto y ejecutar en el terminal:
python manage.py hello_world
Este ejemplo es muy simple, y no usa los modelos de django, pero vale para ver como es la estructura de un subcomando. En el fichero que contiene el código del subcomando, se pueden importar los modelos como en cualquier otro fichero del proyecto.
from myproject.myapp.models import Model
Lo que nos permite generar scripts que interactúen con los modelos creados en nuestro proyecto y usar la metodología de django para trabajar con la base de datos.