Django command执行脚本

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

对比常规脚本

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

(1)使用方式1:

python 复制代码
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管理命令,以便更好地组织和管理脚本):

python 复制代码
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类即可

python 复制代码
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 复制代码
python manage.py initialize_data --name Tom --age 1

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

其他

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

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

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

相关推荐
数据库小组8 小时前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
华科易迅8 小时前
MybatisPlus增删改查操作
android·java·数据库
Kethy__9 小时前
计算机中级-数据库系统工程师-计算机体系结构与存储系统
大数据·数据库·数据库系统工程师·计算机中级
SHoM SSER9 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
熬夜的咕噜猫9 小时前
MySQL备份与恢复
数据库·oracle
jnrjian9 小时前
recover database using backup controlfile until cancel 假recover,真一致
数据库·oracle
lifewange10 小时前
java连接Mysql数据库
java·数据库·mysql
大妮哟10 小时前
postgresql数据库日志量异常原因排查
数据库·postgresql·oracle
还是做不到嘛\.11 小时前
Dvwa靶场-SQL Injection (Blind)-基于sqlmap
数据库·sql·web安全
不写八个11 小时前
PHP教程004:php链接mysql数据库
数据库·mysql·php