发布于 2026-01-06 3 阅读
0

Django 自定义命令 - 新手教程

Django 自定义命令 - 新手教程

各位程序员朋友们,大家好!

本文将介绍如何编写自定义Django 命令,这些命令可以帮助我们在生产环境中测试、上传数据或从 Django 项目中提取有价值的信息。对于新手来说,Django 是一个流行的 Web 框架,由经验丰富的开发人员使用 Python 设计和编写。

自定义命令的主要优势在于,所有 Django 组件都已加载完毕,随时可用。这意味着您可以导入模型、使用Django的 ORM 执行数据库查询,并与项目的所有资源进行交互。


涵盖的主题

  • 创建一个新的 Django 应用并更新 Django 以使用它
  • 可视化应用程序内部所需的目录结构
  • 代码最后执行一些自定义命令:
    • cmd_time.py- 显示当前时间戳
    • cmd_apps列出所有已注册的应用
    • cmd_models列出所有应用程序和相关型号
    • cmd_showcfg- 列出所有 CFG 键和值
  • 代码可在Github上找到(MIT许可证)。

创建一个新的 Django 应用

本教程假设我们已经有一个可以正常运行的 Django 项目,接下来我们将通过子命令创建一个新应用startapp

$ python manage.py startapp app_customcmd
Enter fullscreen mode Exit fullscreen mode

在新app目录下,我们需要创建如下所示的目录结构:

< PROJECT ROOT >                          <-- project directory
 |
 |-- app_customcmd/                                <-- app directory
 |    |-- management/
 |    |    +-- __init__.py
 |    |    +-- commands/
 |    |         +-- __init__.py
 |    |         +-- cmd_....py  <-- module where all commands are saved
Enter fullscreen mode Exit fullscreen mode

一旦我们构建并配置了 Django 以使用新应用程序,commands即使不重启应用程序,目录中定义的所有命令也会自动被发现。


配置 Django 以使用该应用程序

要执行我们的自定义命令,我们需要app_customcmd在项目配置中激活:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app_customcmd',               # <-- NEW
] 
Enter fullscreen mode Exit fullscreen mode

自定义命令

本节介绍一些自定义命令,这些命令将访问和报告与 Django 项目内部相关的一些内容 - 让我们开始吧!


显示当前时间

这条简单的自定义命令帮助我们实现了这个概念。以下是保存在目录中的代码app_customcmd/management/commands

from django.core.management.base import BaseCommand
from django.utils import timezone

class Command(BaseCommand):
    help = 'Displays current time'

    def handle(self, *args, **kwargs):
        time = timezone.now().strftime('%X')
        self.stdout.write("It's %s" % time)
Enter fullscreen mode Exit fullscreen mode

实际执行的代码位于该handle方法中,执行结果应显示类似以下内容:

$ python manage.py cmd_time
It's 09:18:08                <-- The output from our custom CMD
Enter fullscreen mode Exit fullscreen mode

代码中最重要的一点是,我们使用BaseCommand超类来定义类。


显示已注册的应用

此示例将遍历所有已注册和活跃的应用程序,并打印它们的名称。

from django.core.management.base import BaseCommand
from django.apps import apps

class Command(BaseCommand):
    help = 'Displays registered apps'

    def handle(self, *args, **kwargs):
        for app in apps.get_app_configs():
            self.stdout.write(" APP -> %s" % app.verbose_name)
Enter fullscreen mode Exit fullscreen mode

脚本执行及输出:

$ python manage.py cmd_apps
 APP -> Administration                     # Default Django App   
 APP -> Authentication and Authorization   # Default Django App
 APP -> Content Types                      # Default Django App
 APP -> Sessions                           # Default Django App
 APP -> Messages                           # Default Django App
 APP -> Static Files                       # Default Django App
 APP -> App_Customcmd                      # <-- Our NEW App   
Enter fullscreen mode Exit fullscreen mode

显示每个应用程序的模型

此命令与前一个命令非常相似,但还会提供每个应用程序的已注册模型。

from django.core.management.base import BaseCommand

from django.apps import apps

class Command(BaseCommand):
    help = 'Displays registered apps and models'

    def handle(self, *args, **kwargs):

        # Iterate over apps
        for app in apps.get_app_configs():
            self.stdout.write(" APP -> %s" % app.verbose_name)

            # Iterate over models                                # <-- New Code 
            for model in app.get_models():                       # <-- New Code 
                self.stdout.write("\t |- (model) -> %s" % model) # <-- New Code
Enter fullscreen mode Exit fullscreen mode

执行和输出

$ python manage.py cmd_models
 APP -> Administration
         |- (model) -> <class 'django.contrib.admin.models.LogEntry'>
 APP -> Authentication and Authorization
         |- (model) -> <class 'django.contrib.auth.models.Permission'>
         |- (model) -> <class 'django.contrib.auth.models.Group'>
         |- (model) -> <class 'django.contrib.auth.models.User'>
 APP -> Content Types
         |- (model) -> <class 'django.contrib.contenttypes.models.ContentType'>
 APP -> Sessions
         |- (model) -> <class 'django.contrib.sessions.models.Session'>        
 APP -> Messages
 APP -> Static Files
 APP -> App_Forms
 APP -> App_Pdf
 APP -> App_Customcmd
 APP -> App
         |- (model) -> <class 'app.models.Book'>
Enter fullscreen mode Exit fullscreen mode

打印配置变量

此自定义命令扫描settings对象的属性并打印所有值。

from django.core.management.base import BaseCommand
from django.utils import timezone

from django.conf import settings

class Command(BaseCommand):
    help = 'Displays project config'

    def handle(self, *args, **kwargs):

        # type( settings ) => <class 'django.conf.LazySettings'>
        # settings.__dict__

        # Iterate over apps
        for key in settings.__dict__.keys():

            self.stdout.write(" Cfg Key: " + key + " -> %s" % settings.__dict__[ key ] )
Enter fullscreen mode Exit fullscreen mode

输出和执行情况:

(env) PS D:\work\repo-samples\django-learn-by-coding> python manage.py cmd_showcfg
 Cfg Key: _wrapped -> <Settings "config.settings">
 Cfg Key: INSTALLED_APPS -> ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app_forms', 'app_pdf', 'app_customcmd', 'app']
 Cfg Key: DEBUG -> True
 Cfg Key: LOGGING_CONFIG -> logging.config.dictConfig
 Cfg Key: LOGGING -> {}
 Cfg Key: DEFAULT_EXCEPTION_REPORTER -> django.views.debug.ExceptionReporter
 Cfg Key: FORCE_SCRIPT_NAME -> None
 Cfg Key: DEFAULT_TABLESPACE ->
 Cfg Key: DEFAULT_AUTO_FIELD -> django.db.models.BigAutoField
 Cfg Key: ABSOLUTE_URL_OVERRIDES -> {}
 Cfg Key: AUTH_USER_MODEL -> auth.User
 Cfg Key: DATABASES -> {'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': WindowsPath('D:/work/repo-samples/django-learn-by-coding/db.sqlite3'), 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'OPTIONS': {}, 'TIME_ZONE': None, 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}}
...
(truncated output)
Enter fullscreen mode Exit fullscreen mode

在我们的 Django 项目中编写自定义命令可以帮助我们提取统计信息、执行定时任务以及检查在生产环境中运行的项目的健康状况。


感谢阅读!如需更多资源和支持,请访问:

文章来源:https://dev.to/sm0ke/django-custom-command-2mj5