How to create a custom management command in Django?

Sevdimali
Geek Culture
Published in
3 min readAug 3, 2023

In this article, I will show you how to create your first django command with best practices.

Introduction

Django allows us to create custom actions using manage.py.
For instance, we could create custom commands for tasks like database population, or we can schedule tasks to execute at predefined intervals using a custom command.

Creating command file

To get started with commands, initially, we need to create a command file within the “management/commands” directory of our app. The name of this file will be the name of our custom command.

For example, the file structure should look like this, if we want to create a command named customcommand:

Creating the command

Every custom command must inherit from Django’s BaseCommand class, which provides the necessary infrastructure to handle the command execution.

customcommand.py

from django.core.management.base import BaseCommand


class Command(BaseCommand):
help = 'Example Django custom management command!'

def add_arguments(self, parser):
# Positional argument
parser.add_argument('message', nargs='?', default='My Blog!', type=str, help='The custom message')

# Named argument (flag)
parser.add_argument('--custom_flag', action='store_true', help='A custom flag to enable special behavior')

# Optional argument
parser.add_argument('--repeat', type=int, default=1, help='Number of times to repeat the message')

def handle(self, *args, **kwargs):
message = kwargs['message']
custom_flag = kwargs['custom_flag']
repeat = kwargs['repeat']

if custom_flag:
self.stdout.write("Custom flag is enabled!")

for _ in range(repeat):
self.stdout.write(f"Custom message: {message}")

In this example, we’ve added a few arguments:

  • parser.add_argument('message', nargs='?', default='My Blog!', type=str, help='The custom message')— This line adds the "message" argument to the command. It's a positional argument, meaning it can be provided without specifying its name. The nargs='?' specifies that the argument is optional and can be omitted. The default='My Blog!' sets the default value to "My Blog!" if no value is provided. The type=str specifies that the value should be a string. The help argument provides a brief description of when the user requests help for the command.
  • parser.add_argument('--custom_flag', action='store_true', help='A custom flag to enable special behavior')— This line adds the "--custom_flag" argument to the command. It is a named argument and the action='store_true' means that it will act as a flag. If the flag is provided when running the command, the custom_flag variable will be set to True. If the flag is not provided, it will be False.
  • parser.add_argument('--repeat', type=int, default=1, help='Number of times to repeat the message')— This line adds an optional argument called "--repeat" to the command.

Usage of the command

At first, let’s run our command without arguments.

$ python manage.py customcommand
Custom message: My Blog!

As It seems from the output, it prints the default message only one time. because default values for message and repeat arguments are Hello Blog! and 1

Now let’s execute the command with all arguments.

$ python manage.py customcommand "My custom Message" --repeat 5 --custom_flag 
Custom flag is enabled!
Custom message: My custom Message
Custom message: My custom Message
Custom message: My custom Message
Custom message: My custom Message
Custom message: My custom Message

Now, our custom_flag is enabled. The loop runs 5 times and prints the message which we provided.

Conclusion

Django management commands enable us to automate tasks and simplify complex operations in our projects. By using the add_arguments method, we can define the arguments, including positional and named arguments with default values and different types. You can get more info about how to create a custom command from the official Django Documentation.

Thanks for reading. I hope you enjoyed it ❤. If you found the article useful don’t forget to clap and follow me.

This is my #28/52 story in 2023, I’m on a challenge to write 52 stories in 2023.

Keep Learning..!

--

--

Sevdimali
Geek Culture

Python Developer, who loves to share ideas, contribute open source, and play chess. Sharing at least one article in every week. Sometimes more😉