当前位置: 首页 > article >正文

Django command执行脚本

python web项目中经常会使用到脚本,一般来说有两种很简单的方法,一种是直接python function,另一种就是 django 自定义command。

对比常规脚本

这里举个简单的例子,比如初始化数据、文件名称为initialize_data.py

(1)使用方式1:

from django.utils import timezone
from your_app.models import Your_model

def initialize_data():
    unit_data = [
        {
            'name': 'Tom',
            'age': 12,
        },
        {
            'name': 'Jerry',
            'age': 23,
        }
    ]

    Your_model.objects.bulk_create(Your_model(**data))

# 调用初始化函数
initialize_data()

(2)使用方式2(web开发推荐),用BaseCommand(使用from django.core.management.base import BaseCommand可以创建一个自定义的Django管理命令,以便更好地组织和管理脚本):

from django.core.management.base import BaseCommand
from django.utils import timezone
from your_app.models import Your_model

class Command(BaseCommand):
    help = 'Initialize data'

    def handle(self, *args, **options):
        unit_data = [
            {
                'name': 'Tom',
                'age': 12,
            },
            {
                'name': 'Jerry',
                'age': 23,
            }
        ]
        Your_model.objects.bulk_create(Your_model(**data))

通过继承BaseCommand类并实现handle方法,我们可以将脚本逻辑放在handle方法中。然后,我们可以在命令行中运行python manage.py initialize_data来执行该命令。

优势:

  1. 更好的组织和管理:使用BaseCommand可以将脚本逻辑封装为一个自定义的Django管理命令,使代码更加模块化和可维护。
  2. 支持命令行参数:BaseCommand提供了处理命令行参数的功能,可以通过命令行传递参数给脚本。
  3. 集成Django环境:使用BaseCommand可以直接访问Django的模型和其他功能,无需额外的配置。

劣势:

  1. 需要创建一个管理命令:相比直接运行脚本文件,使用BaseCommand需要创建一个自定义的管理命令,并在命令行中运行该命令。


命令行参数

这里讲一下命令行参数。

注:Command类名是用于自定义管理命令的约定,但你可以选择其他名称,只需确保继承自BaseCommand类即可

from django.core.management.base import BaseCommand
from your_app.models import YourModel

class Command(BaseCommand):
    help = 'Initialize data'

    def add_arguments(self, parser):
        parser.add_argument('--name', type=str, help='Set name value')
        parser.add_argument('--age', type=int, help='Set age value')

    def handle(self, *args, **options):
        name = options['name']
        age = options['age']

        if name and age:
            YourModel.objects.create(name=name, age=age)
        else:
            self.stdout.write(self.style.ERROR('Please provide both name and age values.'))

运行以下指令即可创建:

python manage.py initialize_data --name Tom --age 1

        使用add_arguments方法来定义命令行参数。在这个示例中,添加了--name--age两个参数,分别用于设置nameage的值,并提供了帮助文本。在handle方法中,我们通过options['name']options['age']来获取命令行参数的值,并根据这些值创建YourModel实例。

其他

在执行脚本时,往往要注意安全性、可拓展性。

        (1)安全性,如批量修改、多表修改信息,这时候需要加事务保障数据安全;同时注意异常捕获,打印日志检查;

        (2)可拓展性,编写脚本往往我们还希望做到后续可拓展,可用,命令行参数就可以实现这个性质。

        


http://www.kler.cn/a/133836.html

相关文章:

  • ios swift开发--ios远程推送通知配置
  • Linux 常用操作指令大揭秘(下)
  • 服务器显卡和桌面pc显卡有什么不同
  • ubuntu中apt-get的默认安装路径。安装、卸载以及查看的方法总结
  • 若依笔记(八):芋道的Docker容器化部署
  • 【QT】QSS
  • C++初阶 日期类的实现(上)
  • 专业数据标注公司:景联文科技领航数据标注行业,满足大模型时代新需求
  • ⑩④【MySQL】什么是视图?怎么用?视图的检查选项? 视图的作用?[VIEW]
  • 【Redis】RedisTemplate最全的常用方法
  • VB.net webbrowser 自定义下载接口实现
  • 【数据结构】图的存储结构及实现(邻接表和十字链表)
  • 适用于 Windows 的 10 个最佳视频转换器:快速转换高清视频
  • C++ 字符串的 拼接,插入,查找与截取。
  • 消息消费过程
  • CnosDB有主复制演进历程
  • main.js 中的 render函数
  • 几种典型的深度学习算法:(CNN、RNN、GANS、RL)
  • S32K324 UDS Bootloader开发-下位机篇-Bootload软件(2)
  • Redis:新的3种数据类型Bitmaps、HyperLoglog、Geographic
  • SELinux零知识学习十七、SELinux策略语言之类型强制(2)
  • 日志维护库:loguru
  • 图论| 827. 最大人工岛 127. 单词接龙
  • 运行ps显示msvcp140.dll丢失怎么恢复?msvcp140.dll快速解决的4个不同方法
  • react antd下拉选择框选项内容换行
  • js:react使用zustand实现状态管理