I want to automate creation of Django users via a Bash script. I found this snippet which almost suits my needs:
echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', '[email protected]', 'pass')" |\
python manage.py shell
How can I modify it so that it's a nop if the user already exists?
manage.py shell
You can use the QuerySet API methods to check if a user exists, and then create it if it doesn't. Also, it may be easier to put the code in a heredoc:
cat <<EOF | python manage.py shell
from django.contrib.auth import get_user_model
User = get_user_model() # get the currently active user model,
User.objects.filter(username='admin').exists() or \
User.objects.create_superuser('admin', '[email protected]', 'pass')
EOF
Another, more maintainable option is to add a custom management command for your Django app. Adapting the example from the docs, edit yourapp/management/commands/ensure_adminuser.py
to look like this:
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = "Creates an admin user non-interactively if it doesn't exist"
def add_arguments(self, parser):
parser.add_argument('--username', help="Admin's username")
parser.add_argument('--email', help="Admin's email")
parser.add_argument('--password', help="Admin's password")
def handle(self, *args, **options):
User = get_user_model()
if not User.objects.filter(username=options['username']).exists():
User.objects.create_superuser(username=options['username'],
email=options['email'],
password=options['password'])
Then you can call the new custom command from your Bash script like this:
python manage.py ensure_adminuser --username=admin \
[email protected] \
--password=pass
you can use get_or_create(). If it exists it will do nothing, else it will create one.
You'd have to set the is_staff
and is_superuser
to True
manually
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With