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