Comandos de administración personalizados de Django

Prerrequisitos:  Introducción e instalación de Django

Manage.py en Django es una utilidad de línea de comandos que funciona de manera similar al comando django-admin. La diferencia es que apunta hacia el archivo settings.py del proyecto. Esta utilidad manage.py proporciona varios comandos que debe tener mientras trabaja con Django. Algunos de los comandos más utilizados son:

  • python manage.py startapp
  • python manage.py hacer migraciones
  • python manage.py migrar
  • python manage.py servidor de ejecución

Curiosamente, podemos crear nuestros propios comandos de administración personalizados para cumplir con una amplia variedad de requisitos que van desde interactuar con nuestra aplicación usando la línea de comandos para servir como una interfaz para ejecutar Cron Jobs. Vamos a crear un Comando de administración personalizado que nos brinde las estadísticas o métricas de los nuevos artículos publicados, comentarios sobre esos artículos en un día en particular.

Empezando

Siga la Introducción e instalación de Django para configurar un entorno virtual e instalar Django

Paso 1: Inicialice un proyecto siguiendo el comando

django-admin startproject geeks_site

Paso 2: crea una aplicación llamada blog

python manage.py startapp blog

Paso 3: Agrega tu aplicación a settings.py

En geeks_site/settings.py

Python3

# Application definition
  
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
      'blog',
]

Paso 4: cree modelos llamados artículo y comentario en la aplicación de blog

Artículo modelo :

  • Campos :
    • title : Almacena el título de un artículo
    • cuerpo : contenido de ese artículo
    • created_on : Fecha y hora en que se creó ese artículo

Comentario del modelo :

  • Campos :
    • artículo : Artículo sobre el que se crea un comentario.
    • texto : comentario real
    • created_on : Fecha y hora en que se creó ese artículo

En blog/modelos.py

Python3

from django.db import models
  
  
class Article(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
  
  
class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    text = models.CharField(max_length=200)
    created_on = models.DateTimeField(auto_now_add=True)

Paso 5: Registre su modelo en blog/admin.py para que aparezca en el panel de administración.

En blog/admin.py

Python3

from django.contrib import admin 
from .models import Article, Comment
    
admin.site.register(Article)
admin.site.register(Comment)

Paso 6: ahora, para migrar todos sus cambios e iniciar el servidor, ejecute los siguientes comandos en su terminal

python manage.py makemigrations
python manage.py migrate
python manage.py runserver

Cree una cuenta de superusuario para iniciar sesión en el panel de administración

python manage.py createsuperuser

Ahora, visite el panel de administración en http://127.0.0.1:8000/admin/

Crea algunos artículos y luego algunos comentarios:

Ahora, comencemos a trabajar en la creación de comandos de administración personalizados de Django.

  • Agregue un directorio de administración/comandos a la aplicación de blog
  • Agregue __init__.py a blog/management y __init__.py + archivos stats.py al directorio blog/management/commands

Nota: Django registrará un comando manage.py para cada módulo de Python en ese directorio cuyo nombre no comience con un guión bajo

La estructura de carpetas de la aplicación de blog se ve así:

Usaremos python manage.py stats para ejecutar nuestro comando de administración personalizado. Ahora configuraremos lo que realmente hará este comando.

En estadísticas.py

Python3

from django.core.management.base import BaseCommand
from django.db.models import Count
from blog.models import Article, Comment
from datetime import timedelta, datetime
from django.utils.timezone import utc
  
  
def now():
    return datetime.utcnow().replace(tzinfo=utc)
  
  
class Command(BaseCommand):
    help = 'Displays stats related to Article and Comment models'
  
    def handle(self, *args, **kwargs):
        From = now() - timedelta(hours=5)
        To = now()
  
        articles_published_in_last_5_hour = Article.objects.filter(
            created_on__gt=From, created_on__lte=To).count()
        comments_published_per_article = Comment.objects.filter(
            created_on__gt=From, created_on__lte=To).values(
          'article').annotate(count=Count('article')).order_by()
  
        print("Articles Published in last 5 hours = ",
              articles_published_in_last_5_hour)
          
        print("Comments per Article in last 5 hours")
        for data in comments_published_per_article:
            print(data)

Comprender el archivo stats.py

Básicamente, un comando de administración de Django se construye a partir de una clase llamada Command que hereda de BaseCommand .

1) ayuda: Indica lo que realmente hace el comando. Ejecute el siguiente comando y vea la ayuda

python manage.py stats --help

2) handle(): maneja toda la lógica que debe ejecutarse cuando se ejecuta el comando. Entendamos el código dentro del método handle()

  • Aquí nos preocupan las siguientes dos estadísticas
    • Número de artículos que se publicaron en las últimas 5 horas
    • Número de comentarios creados en las últimas 5 horas por artículo
  • Desde: Hora actual – 5 horas
  • Hasta: Hora actual
  • articles_published_in_last_5_hour: un valor entero
  • comments_published_per_article:  objeto de conjunto de consultas o una lista de diccionarios
  • imprimir declaraciones para generar datos en la terminal

Ahora, ejecuta el siguiente comando en tu terminal:

python manage.py stats

Producción : 

Adición de argumentos

Django usa el módulo argparse para manejar los argumentos personalizados. Necesitamos definir una función add_arguments bajo la clase de comando para manejar argumentos.

Python3

from django.core.management.base import BaseCommand
from django.db.models import Count
from app.models import Article, Comment
from datetime import timedelta, datetime
from django.utils.timezone import utc
  
  
def now():
    return datetime.utcnow().replace(tzinfo=utc)
  
class Command(BaseCommand):
    help = 'Displays stats related to Article and Comment models'
  
    def add_arguments(self, parser):
        parser.add_argument('-t', '--time', type=int, help='Articles published in last t hours')
  
    def handle(self, *args, **kwargs):
        t = kwargs['time']
        if not t:
            t=5
        From = now() - timedelta(hours=t)
        To = now()
  
        articles_published_in_last_t_hour = Article.objects.filter(
            created_on__gt=From, created_on__lte=To).count()
          
        comments_published_per_article = Comment.objects.filter(
            created_on__gt=From, created_on__lte=To).values(
            'article').annotate(count=Count('article')).order_by()
  
        print(f"Articles Published in last {t} hours = ",
              articles_published_in_last_t_hour)
  
        print(f"Comments per Article in last {t} hours")
        for data in comments_published_per_article:
            print(data)

Producción:

Publicación traducida automáticamente

Artículo escrito por prakharpratyush y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *