Django | 执行项目下指定的脚本

1 描述

有时候会碰到这样的场景,对于一些业务升级,我需要把数据库数据做些处理,同时又想以 Django 项目的环境变量执行脚本,这个时候使用 python 脚本是再适合不过的手段了。

2 使用自带的 shell

python manage.py shell < script 

或者

./manage.py shell < script
2.1 举例

图片描述

2.2 脚本代码如下:


# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

from django.contrib.auth.models import User


def show_user():
    user = User.objects.get(username='admin')
    print 'I am {0}'.format(user.username)


show_user()

2.3执行命令

python manage.py shell < script1.py

2.4 运行结果如下:

2.4.1 安装了 ipython(这里版本为 4.2.0)

图片描述

2.4.2 没有安装 ipython

图片描述

3 使用 django-extensions

  • 手段1:在 app 下面建立一个 scripts 包,然后建立你的脚本

  • 手段2:在项目目录下面建立一个 scripts 包,然后建立你的脚本

运行脚本命令如下:

python manage.py runscript script_name 

或者 

./manage.py runscript script_name

3.1 手段1

3.1.1 针对手段1

图片描述

3.1.2 脚本如下:

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

from django.contrib.auth.models import User


def run():
    user = User.objects.get(username='admin')
    print 'project_dir/cat/scripts/:I am {0}'.format(user.username)

3.1.3 运行命令

python manage.py runscript showadmin

3.1.4 执行结果如下

图片描述

3.2 手段2

3.2.1 针对手段 2

图片描述

3.2.2 脚本如下:

# -*- coding: utf-8 -*-

from __future__ import absolute_import
from __future__ import unicode_literals

from django.contrib.auth.models import User


def run():
    user = User.objects.get(username='admin')
    print 'project_dir/scripts/:I am {0}'.format(user.username)

3.2.3 运行命令

./manage.py runscript showadmin

3.2.4 执行结果

图片描述

3.3 注意

runscript 命令会首先检查每个 app 下的 scripts 目录,如果找到对应名字的脚本就会执行.然后检查 project_dir/scripts 目录下是否包含符合名字的脚本,如果找到也会执行.也就是说,我们可以在不同的 app 中创建相同名字的脚本,并且都会被执行.

图片描述

此时有两个 showadmin.py 文件

  • djtest/cat/scripts/showadmin.py

  • djtest/scripts/showadmin.py

运行结果如下:

图片描述

4 使用自定义命令

这个自行参照文档

5 使用 migrations

示例如下:

from django.db import migrations

from apps.xx.scripts.xx import run


class Migration(migrations.Migration):
    initial = True

    dependencies = [
        ('thirdservice', '0007_auto_20160909_1021'),
    ]

    operations = [
        migrations.RunPython(run),
    ]

run 方法中封装业务逻辑,这样更为方便一些


青阳半雪
点滴记录,步步成长

现实与完美之间

1.6k 声望
24 粉丝
0 条评论
推荐阅读
Django | 信号使用思考
重拾些许关于信号模块使用的记忆,记录对于 Django 信号使用的思考。本文使用的 Django 的版本是 4.21 源码注释 {代码...} 2 函数清单2.1 _make_id 方法 {代码...} 首先认真分析下其业务实现,target 参数是接收...

青阳半雪阅读 447

Django笔记十三之select_for_update等选择和更新等相关操作
本文首发于微信公众号:Hunter后端原文链接:Django笔记十三之select_for_update等选择和更新等相关操作本篇笔记将介绍 update 和 create 的一些其他用法,目录如下:get_or_createupdate_or_createselect_for_up...

Hunter阅读 977

封面图
Django笔记十二之defer、only指定返回字段
本文首发于微信公众号:Hunter后端原文链接:Django笔记十二之defer、only指定返回字段本篇笔记将介绍查询中的 defer 和 only 两个函数的用法,笔记目录如下:deferonly1、deferdefer 的英语单词的意思是 延迟、...

Hunter阅读 938

封面图
Django笔记十四之统计总数、最新纪录和空值判断等功能
本文首发于微信公众号:Hunter后端。原文链接:Django笔记十四之统计总数、最新纪录和空值判断等功能本篇笔记将介绍一些 Django 查询中统计总数、最新纪录和空值判断等功能。countin_bulklatest、earliestfirst、...

Hunter阅读 912

封面图
Django笔记四十一之Django中使用es
本文首发于公众号:Hunter后端原文链接:Django笔记四十一之Django中使用es前面在 Python 连接 es 的操作中,有过介绍如何使用 Python 代码连接 es 以及对 es 数据进行增删改查。这一篇笔记介绍一下如何为 es 的 ...

Hunter阅读 891

封面图
Django笔记六之外键ForeignKey介绍
本文首发于微信公众号:Hunter后端原文链接:Django笔记六之外键ForeignKey介绍这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法。这是一种一对多的字段类型,表示两张表之间的关联...

Hunter阅读 881

Django笔记三十六之单元测试汇总介绍
在我们创建的每一个 application 下面都有一个 tests.py 文件,我们通过继承 django.test.TestCase 编写我们的单元测试。

Hunter阅读 864

封面图

现实与完美之间

1.6k 声望
24 粉丝
宣传栏