自定义Django管理命令

306 阅读4分钟

自定义Django管理命令

  • 最后更新 : 2021年8月6日

先决条件。 Django介绍和安装

Django中的Manage.py是一个命令行工具,其工作原理类似于django-admin命令。不同的是,它指向项目的settings.py文件。这个manage.py工具提供了你在使用Django时必须具备的各种命令。一些最常用的命令是--

  • python manage.py startapp
  • python manage.py makemigrations
  • python manage.py migrate
  • python manage.py runserver

有趣的是,我们可以创建自己的自定义管理命令,以满足各种各样的要求,从使用命令行与我们的应用程序进行交互到作为执行Cron作业的接口。我们将创建一个自定义管理命令,为我们提供某一天发表的新文章和这些文章的评论的统计数据或指标。

开始使用

按照Django介绍和安装 来设置一个虚拟环境并安装Django。

第1步: 通过以下命令初始化 一个项目

django-admin startproject geeks_site

第2步: 创建一个名为博客的应用程序

python manage.py startapp blog

3步: 将你的应用程序添加到settings.py中

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

第4步:博客应用中创建名为ArticleComment的模型

文章模型

  • 字段:
    • 标题。存储文章的标题
    • body。该文章的内容
    • created_on。该文章的创建日期和时间

模型评论:

  • 字段:
    • 文章。 创建评论的文章
    • 文本。实际评论
    • created_on:该文章的创建日期和时间

blog/models.py

Python3

from django.dbimport 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)

第5步: 在blog/admin.py中注册你的模型,这样它就会在管理面板中显示出来。

blog/admin.py

Python3

from django.contribimport admin
from .modelsimport Article, Comment
admin.site.register(Article)
admin.site.register(Comment)

**第6步:**现在,为了迁移你所有的修改并启动服务器,在你的终端运行以下命令

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

创建一个超级用户账户来登录到管理面板上

python manage.py createsuperuser

现在,访问管理面板:http://127.0.0.1:8000/admin/

创建一些文章,然后创建一些评论。

现在,让我们开始着手创建自定义Django管理命令

  • 博客应用程序中添加一个管理/命令 目录
  • blog/management中加入**__init__.py**,在blog/management/commands目录中加入__init__.py**+ stats.py**文件。

注意:Django将为该目录中名称不以下划线开头的每个Python模块注册一个manage.py命令。

博客应用程序的文件夹结构看起来像这样。

我们将使用python manage.py统计来运行我们的自定义管理命令。现在我们将配置这个命令实际上要做什么。

stats.py

Python3

from django.core.management.baseimport BaseCommand
from django.db.modelsimport Count
from blog.modelsimport Article, Comment
from datetimeimport timedelta, datetime
from django.utils.timezoneimport 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 datain comments_published_per_article:
print(data)

了解 stats.py 文件

基本上,Django管理命令是由一个名为Command的类构建的,该类继承于BaseCommand

**1) 帮助。**它告诉人们这个命令实际上是做什么的。运行下面的命令,可以看到帮助。

python manage.py stats --help

**2) handle()。**它处理命令执行时需要执行的所有逻辑。让我们了解一下 **handle()**方法中的代码

  • 这里我们关注的是以下两个统计信息
    • 在过去5小时内发表的文章数量
    • 每篇文章在过去5小时内创建的评论数
  • 从。 当前时间 - 5小时
  • 至。 当前时间
  • **articles_published_in_last_5_hour :**一个整数值
  • comments_published_per_article : queryset对象或一个字典的列表
  • print语句,在终端上输出数据

现在,在你的终端运行以下命令。

python manage.py stats

输出 :

添加参数

Django使用argparse模块来处理自定义参数。我们需要在命令类下定义一个函数add_arguments来处理参数。

Python3

from django.core.management.baseimport BaseCommand
from django.db.modelsimport Count
from app.modelsimport Article, Comment
from datetimeimport timedelta, datetime
from django.utils.timezoneimport 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 datain comments_published_per_article:
print(data)

输出。

宅男注意了!巩固你的基础,通过 Python编程基础课程,学习基础知识。

首先,你的面试准备工作通过该课程加强你的数据结构概念。 Python DS课程。要开始你的机器学习之旅,请加入**机器学习--基础级课程**。

我的个人笔记 arrow_drop_up

保存