|synopsis:||Runs a script in the django context.|
The runscript command lets you run an arbritrary set of python commands within the django context. It offers the same usability and functionality as running a set of commands in shell accessed by:
$ python manage.py shell
This example assumes you have followed the tutorial for Django 1.8+, and
created a polls app containing a
Question model. We will create a script
that deletes all of the questions from the database.
To get started create a scripts directory in your project root, next to manage.py:
$ mkdir scripts $ touch scripts/__init__.py
Note: The __init__.py file is necessary so that the folder is picked up as a python package.
Next, create a python file with the name of the script you want to run within the scripts directory:
$ touch scripts/delete_all_questions.py
This file must implement a run() function. This is what gets called when you run the script. You can import any models or other parts of your django project to use in these scripts.
# scripts/delete_all_questions.py from polls.models import Question def run(): # Fetch all questions questions = Question.objects.all() # Delete questions questions.delete()
Note: You can put a script inside a scripts folder in any of your apps too.
To run any script you use the command runscript with the name of the script that you want to run.
$ python manage.py runscript delete_all_questions
Note: The command first checks for scripts in your apps i.e. app_name/scripts folder and runs them before checking for and running scripts in the project_root/scripts folder. You can have multiple scripts with the same name and they will all be run sequentially.
You can pass arguments from the command line to your script by passing a space separated
list of values with
--script-args. For example:
$ python manage.py runscript delete_all_questions --script-args staleonly
The list of argument values gets passed as arguments to your run() function. For example:
# scripts/delete_all_questions.py from datetime import timedelta from django.utils import timezone from polls.models import Question def run(*args): # Get all questions questions = Question.objects.all() if 'staleonly' in args: # Only get questions more than 100 days old questions = questions.filter(pub_date__lt=timezone.now() - timedelta(days=100)) # Delete questions questions.delete()
If an exception occurs you will not get a traceback by default. To get a traceback specify
--traceback. For example:
$ python manage.py runscript delete_all_questions --traceback