[Django 1.0] Commande automatique personnalisée

Publié le 14 avril 2009 par Samuel Martin

Pouvoir utiliser des commandes automatiques pour créer un script sql à partir d'un document json, obtenir un dump de la base, créer un projet .. bref c'est déjà bien pratique, mais développer ses propres commandes (en 5 minutes) c'est autre chose. je me permets ici de décrire rapidement sous forme d'item la marche à suivre. Cet article a pour principal but la découverte des commandes personnalisées en django.

Création de l'arborescence

Dans votre projet puis application :

  1. Ajouter/créer le dossier "management"
  2. Puis dans "management" créer le dossier "commands"
  3. Puis enfin dans ce dosser créer le fichier montest.py
  4. Très important !!!, à chaque niveau de dossier, n'oubliez pas de créer __init__.py

Structure minimum de votre commande

L'exemple ci-dessous permet d'obtenir une commande personnalisée capable d'afficher Hello World, il n'y a rien d'impressionnant, mais il faut bien passer par là.

# -*- coding: utf-8 -*-
from django.core.management.base import BaseCommand, CommandError
from optparse import make_option
class Command(BaseCommand):
    option_list = BaseCommand.option_list + (
        make_option('--long', '-l', dest='long',
            help='Help for the long options'),
     )
    help = 'Help text goes here'

    def handle(self, **options):
        print "Hello World"

Intéragir avec vos modèles (pour aller plus loin)

Bien sûr dans bon nombre de cas , il est intéressant d'intéragir avec vos modèles. N'oubliez donc pas de les inclure (vos modèles), sans quoi python risque de devenir vite verbeux. Dans cette sous rubrique, je présente un rapide exemple illustrant l'interrogation de votre base de données. L'exemple est simple : Utilisation d'un blog et récupération d'un article.

En début de fichier

from blog.article.models import Article

Puis récupérer/afficher un article en particulier

print Article.objects.get(id=2)

Pourquoi vous présenter ceci, tout simplement pour vous montrer qu'il serait facilement possible de récupérer les informations d'un article via une ligne de commande (python manage.py montest). L'intérêt est limité, dans mon cas je m'en sers plutôt pour lancer la génération de dossier en fonction des valeurs contenues dans une base de données, bref c'est sans limite.

Lancement de la commande personnalisée

Comme tout commande dans django le lancement s'effectue par défaut, c'est à dire sans argument ni option, de la façon suivante

python manage.py montest

Aller plus loin

Je n'ai pas testé, mais rien d'impossible ; vous pouvez inclure des arguments ainsi que des options pour modifier le comportement de votre commande personnalisée. Vous savez tout...