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)可拓展性,编写脚本往往我们还希望做到后续可拓展,可用,命令行参数就可以实现这个性质。

相关推荐
apihz20 分钟前
域名WHOIS信息查询免费API使用指南
android·开发语言·数据库·网络协议·tcp/ip
gwcgwcjava25 分钟前
[时序数据库-iotdb]时序数据库iotdb的安装部署
数据库·时序数据库·iotdb
SHUIPING_YANG40 分钟前
根据用户id自动切换表查询
java·服务器·数据库
爱吃烤鸡翅的酸菜鱼1 小时前
IDEA高效开发:Database Navigator插件安装与核心使用指南
java·开发语言·数据库·编辑器·intellij-idea·database
超奇电子1 小时前
阿里云OSS预签名URL上传与临时凭证上传的技术对比分析
数据库·阿里云·云计算
神仙别闹1 小时前
基于C#+SQL Server实现(Web)学生选课管理系统
前端·数据库·c#
m0_653031361 小时前
PostgreSQL技术大讲堂 - 第97讲:PG数据库编码和区域(locale)答疑解惑
数据库·postgresql
会编程的林俊杰2 小时前
MySQL中的锁有哪些
数据库·mysql
cts6182 小时前
Milvus分布式数据库工作职责
数据库·分布式·milvus
周胡杰2 小时前
鸿蒙加载预置数据库-关系型数据库-如何读取本地/预制数据库
数据库·华为·harmonyos·鸿蒙