If you want a completely clean start, you're gonna wanna drop the DB. Which means then to recreate it, add privileges, re-generate all the migrations, re-run them and create a superuser.
Good news is that you can easily make all this into a single/few line commands.
Fresh migration files
If you delete the whole folders, you're gonna have to run the makemigrations
command mentioning all the app names. That's a hassle if you do this often. To have Django see the apps that need migrations, you'll wanna keep the migrations
folder and the __init__.py
inside them.
Here's a bash command for that:
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
Then the usual (this should create migrations for all the apps that had migrations before):
python manage.py makemigrations
Resetting the DB
For SQLite just delete the DB file.
For PostgreSQL run this in the console:
psql -c "drop database <db_name>;"
psql -c "create database <db_name>;"
psql -c "grant all on database <db_name> to <db_user>;"
And then finally re-run migrations with
python manage.py migrate
Superuser
You're gonna obviously be missing a superuser, so you might wanna also do:
python manage.py createsuperuser
No-input way of doing that is piping python code into the shell:
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
Generally speaking about these very common actions - Do yourself a favour and write a bit of bash. It has saved me many, many accumulated hours over the years of working with not only Django. Because even better than a oneline command is having a whole utility file to store more of these handy functions. Then you can just run something like:
django --reset_migrations
db --reset <my_db>
django --migrate
Or even aggregate that into a single line if you find yourself repeating the same few actions. Add this to your bashprofile
reset_django() {
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
python manage.py makemigrations
psql -c "drop database <db_name>;"
psql -c "create database <db_name>;"
psql -c "grant all on database <db_name> to <db_user>;"
python manage.py migrate
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('admin', 'badmin@myproject.com', 'pa$$w0rd')" | python manage.py shell
}
My Django lite utilities for inspiration:
#!/bin/bash
django() {
project_name=$(basename $PWD)
project_path="$PWD"
manage_path="${project_path}/${project_name}/manage.py"
if [ ! -f $manage_path ] ; then # No project/manage.py
echo "Error: Could not locate Django manage.py file."
return -1
fi
if [ $# -eq 0 ] ; then
echo "Django project detected."
fi
while [ ! $# -eq 0 ]
do
case "$1" in
--help | -h)
echo "Django shortcut, unknown commands are forwarded to manage.py"
echo " -c, --check Run Django manage.py check."
echo " --req Install requirements."
echo " -r, --run Run server."
echo " -s, --shell Run Django shell plus."
echo " -sd, --shell Run Django shell plus. Debug DB (print sql)"
echo ""
;;
--check | -c)
python $manage_path check
;;
--shell | -s)
python $manage_path shell_plus --bpython
;;
--shell | -sd)
python $manage_path shell_plus --bpython --print-sql
;;
--run | -r)
python $manage_path runserver
;;
--req)
pip install -r $project_path/requirements.txt
;;
--mig | -m)
python $manage_path makemigrations
python $manage_path migrate
;;
--reset_migrations)
find . -path "*migrations*" -not -regex ".*__init__.py" -a -not -regex ".*migrations" | xargs rm -rf
python $manage_path makemigrations
;;
*)
python $manage_path "$@"
;;
esac
shift
done
}