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

相关推荐
云空32 分钟前
《Qt Creator 4.11.1 教程》
数据库·qt
shine_du1 小时前
架构师之路--达梦数据库学习计划
数据库·达梦数据库·dameng
╰つ゛木槿1 小时前
Spring Boot与Django对比:哪个更适合做为Web服务器框架?
前端·spring boot·django
潇潇和多客开源1 小时前
数据库的数据被清除了,该如何恢复?
数据库·oracle
胖头鱼的鱼缸(尹海文)1 小时前
数据库管理-第274期 Oracle Enterprise Manager 24ai新特性一览(20241223)
数据库·oracle
Null箘2 小时前
从零创建一个 Django 项目
后端·python·django
搬码后生仔2 小时前
SQLite 是一个轻量级的嵌入式数据库,不需要安装服务器,直接使用文件即可。
数据库·sqlite
码农君莫笑2 小时前
Blazor项目中使用EF读写 SQLite 数据库
linux·数据库·sqlite·c#·.netcore·人机交互·visual studio
江上挽风&sty2 小时前
【Django篇】--动手实践Django基础知识
数据库·django·sqlite
向阳12182 小时前
mybatis 动态 SQL
数据库·sql·mybatis