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
方法中封裝業務邏輯,這樣更為方便一些